重定向stdout时在python上调用子进程时出错

时间:2014-03-26 13:55:27

标签: python subprocess

我试图过滤由python脚本中的函数生成的文件:

out = subprocess.check_output(["sed","-n","'s/pattern/&/p'",oldFile,">",newFile])

但是,我得到了关于我的命令的跟随错误:

returned non-zero exit status 1

有什么问题?

2 个答案:

答案 0 :(得分:3)

正如devnull所说,>由shell解释。由于它是better to avoid using shell=True,请改用stdout参数:

import subprocess
with open(newFile, 'w') as newFile:
    subprocess.check_call(
        ["sed", "-n", "s/S/&/p", oldFile], stdout=newFile)

答案 1 :(得分:2)

您正在使用>重定向,这需要shell来解释语法。

当您重定向sed的输出时,这里没有必要使用check_output。请改用subprocess.call()subprocess.check_call()并验证返回代码。

通过shell运行命令:

import pipes

out = subprocess.call("sed -n 's/S/&/p' {} > {}".format(
    pipes.quote(oldFile), pipes.quote(newFile), shell=True)

或使用烟斗:

with open(newFile, 'w') as pipetarget:
    out = subprocess.call(["sed", "-n", "s/S/&/p", oldFile],
                                  stdout=pipetarget)

请注意,当在参数列表中用作单独的参数时,不应在's/S/&/p'字符串上使用引号;当没有将它传递给shell时,它也不需要从shell解析中转义。