Python subprocess.check_output(args)失败,而通过Windows命令行执行的args工作正常

时间:2015-02-11 09:20:33

标签: python cmd subprocess

python subprocess.check_output的一些问题。

output = subprocess.check_output(args)

我的args是:

args = "C:\\DO\\bin\\Config.exe --ChCfg7 --LFE -b1152000 C:\\DO\\PCM\\1.wav C:\\DO\\PCM\\2.wav C:\\DO\\PCM\\3.wav C:\\DO\\PCM\\4.wav C:\\DO\\PCM\\5.wav C:\\DO\\PCM\6.wav --ModeBCast -oC:\\DO\\OUT\\outfile > C:\\DO\\OUT\\log.txt

这在从标准Windows命令行执行时有效,但在通过Python subprocess.check_output执行时不起作用。在win cmd的情况下,还有输出文件和log.txt,python脚本生成大小为0的文件,根本没有log.txt。

3 个答案:

答案 0 :(得分:2)

使用args列表并将输出重定向到文件:

import subprocess

args = ['C:/DO/bin/Config.exe', '--ChCfg7', '--LFE', '-b1152000', 'C:/DO/PCM/1.wav', 'C:/DO/PCM/2.wav', 'C:/DO/PCM/3.wav', 'C:/DO/PCM/4.wav', 'C:/DO/PCM/5.wav', 'C:/DO/PCM/6.wav', '--ModeBCast', '-oC:/DO/OUT/outfile']

with open("C:/DO/OUT/log.txt", "w") as f:
    subprocess.check_call(args, stdout=f)

您可以使用shell=True,但对于security reasons通常不是一个好主意,使用上面的代码可以很容易地实现相同的功能,只需将输出重定向到文件即可。

答案 1 :(得分:1)

output = subprocess.check_output(args,shell=True)

使用shell=True

运行此功能

答案 2 :(得分:0)

>是一个shell重定向运算符。在shell中运行命令或(更好)在@Padraic Cunningham suggested中用Python模拟它:

#!/usr/bin/env python
import subprocess

args = r"C:\DO\bin\Config.exe --ChCfg7 --LFE -b1152000".split()
args += [r'C:\DO\PCM\%d.wav' % i for i in range(1, 7)]
args += ["--ModeBCast", r"-oC:\DO\OUT\outfile"]    
with open(r"C:\DO\OUT\log.txt", "wb", 0) as output_file:
    subprocess.check_call(args, stdout=output_file)

代码使用Windows路径的原始字符串文字来避免转义反斜杠。

除非您想运行内置命令(例如shell=True),否则在Windows上使用dir通常没有意义。如果args未使用来自外部来源的输入构建,则security considerations执行而不是shell=True启动了其他流程(%COMSPEC%),它会更改how the executable is searched并更改what characters should be escaped (what characters are metacharacters) - 除非必要,否则请勿使用shell=True

相关问题