在subprocess.Popen命令中使用变量

时间:2016-04-27 21:23:47

标签: python subprocess popen

现在我有一个测试file.dat,我运行hexdump并将输出放入hexdump.dat文件。

subprocess.Popen(['hexdump file.dat > hexdump.dat' ], shell=True)  

作为旁注,我看到了不使用shell=True的建议,但我基本上得到了错误OSError: [Errno 2] No such file or directory

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

我尝试过用户输入案例:

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)        

还有:

p = subprocess.Popen(['hexdump',  inputs, ' > hexdump.dat' ], stdout=PIPE, stderr=STDOUT)                                          

感谢您的帮助,我知道我没有正确理解这里所需的结构,所以一些“手持”的答案将不胜感激。

5 个答案:

答案 0 :(得分:3)

  

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

类似的东西:

with open('hexdump.dat', 'wb') as f:
    p = subprocess.Popen(['hexdump', 'file.dat'], stdout=f)
    p.wait()

您应该阅读Popen以及shell参数的内容,并做出决定。

答案 1 :(得分:1)

您可以使用stdout参数重定向,而不是使用>重定向。至于文件列表,您只需将文件列表附加到包含hexdump的数组,即

myfiles = ['file1','file2']
with open('hexdump.dat', 'w') as output:
    proc = subprocess.Popen(['hexdump'] + myfiles, stdout=output)

答案 2 :(得分:1)

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

您发布了以下代码:

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的文件不存在,您将获得错误(如果确实存在,它可能仍然不是您想要的。)

你想要的是建立你正在执行的字符串:

file = "input.dat"
p = subprocess.Popen("hexdump " + file + " > hexdump.dat", shell=True)

答案 3 :(得分:1)

我发现使用python和变量进行shell重定向的最简单方法如下:

subprocess.check_output('svnadmin load %s < %s' % (repo, fname), shell=True)

它可以处理非常大的文件。

答案 4 :(得分:-1)

首先,关于找不到文件,您可能需要指定当前的工作目录。

subprocess.Popen(['hexdump file.dat > hexdump.dat' ], shell=True, cwd='/bar/foo') 

关于将数组作为参数传入,通常类似于:

args = [ 'hexdump', ] + inputs
subprocess.Popen( args, cwd='/foo/bar' )