首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在subprocess.Popen命令中使用变量

在subprocess.Popen命令中使用变量
EN

Stack Overflow用户
提问于 2016-04-27 21:23:46
回答 5查看 6.7K关注 0票数 3

现在,我有一个测试file.dat,在它上运行十六进制,并将输出放入hexdump.dat文件中。

代码语言:javascript
复制
subprocess.Popen(['hexdump file.dat > hexdump.dat' ], shell=True)  

顺便提一句,我已经看到了不使用shell=True的建议,但实际上我得到了错误OSError: [Errno 2] No such file or directory

因此,我希望能够传递变量或数组、文件,而不是硬编码的"file.dat“。“文件”可以是用户输入,也可以是从前一个子进程部分生成的数组/列表。

我尝试过一个用户输入案例:

代码语言:javascript
复制
from subprocess import Popen, PIPE, STDOUT 
files = raw_input('File Name: ')                                                                                                 
p = subprocess.Popen(['hexdump files > hexdump.dat' ], stdout=PIPE, stderr=STDOUT)                                         
out,err = p.communicate(input=files)        

还包括:

代码语言:javascript
复制
p = subprocess.Popen(['hexdump',  inputs, ' > hexdump.dat' ], stdout=PIPE, stderr=STDOUT)                                          

谢谢你的帮助,我知道我不太理解这里所需要的结构,所以一些“手持式”的答案会很感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-27 21:38:33

您需要shell=True,因为否则它会查找具有该名称的可执行文件。shell=True告诉方法使用shell来执行命令,这样>和朋友就会变成您最初想要的样子(重定向)。

您发布的下列代码:

代码语言:javascript
复制
from subprocess import Popen, PIPE, STDOUT 
files = raw_input('File Name: ')                                                                                                 
p = subprocess.Popen(['hexdump files > hexdump.dat' ], stdout=PIPE, stderr=STDOUT)                                         
out,err = p.communicate(input=files)  

不会工作,因为您只是将files传递给hexdump,而且如果一个名为files的文件不存在,您将得到一个错误(如果它确实存在,它可能仍然不是您想要的)。

您想要构建要执行的字符串:

代码语言:javascript
复制
file = "input.dat"
p = subprocess.Popen("hexdump " + file + " > hexdump.dat", shell=True)
票数 4
EN

Stack Overflow用户

发布于 2016-04-27 21:46:03

警告:如果与不受信任的输入相结合,传递shell=True可能会造成安全隐患。有关详细信息,请参阅常用参数下的警告。

类似于:

代码语言:javascript
复制
with open('hexdump.dat', 'wb') as f:
    p = subprocess.Popen(['hexdump', 'file.dat'], stdout=f)
    p.wait()

您应该阅读Popenshell参数的作用,并做出决定。

票数 3
EN

Stack Overflow用户

发布于 2016-04-27 21:38:32

与使用>重定向不同,您可以使用stdout重定向。至于文件列表,您只需将文件列表附加到包含十六进制的数组中,即

代码语言:javascript
复制
myfiles = ['file1','file2']
with open('hexdump.dat', 'w') as output:
    proc = subprocess.Popen(['hexdump'] + myfiles, stdout=output)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36901169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档