subprocess.call无法使用文件输入

时间:2016-12-06 15:43:52

标签: python subprocess

我想调用的命令看起来像这样:

  

mycmd arg1 arg2 arg3< infile.ext>> outfile.ext

其中infile.ext是文件mycmd读入以执行其进程,而outfile.ext类似于日志文件。

我的Python代码是:

from subprocess import call

impArgs = "%s %s %s < %s >> %s" % (arg1, arg2, arg3, impFilePath, rptFilePath)
impResult = call(["mycmd ", impArgs])

我得到impResult 3,没有错误,但命令没有被调用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您正在使用shell的重定向功能。默认情况下,Popen只会启动该过程。它不使用shell,因为在基本情况下根本不需要shell。

使用shell=True并将整个命令作为字符串传递。

来自子流程导入调用

impArgs = "mycmd %s %s %s < %s >> %s" % (arg1, arg2, arg3, impFilePath, rptFilePath)
impResult = call(impArgs, shell=True)

或使用管道功能shown in docs

with open(impFilePath) as src, open(rptFilePath) as dst:
    call(['mycmd', arg1, arg2. arg3], stdin=src, stdout=dst)

答案 1 :(得分:0)

而不是

impArgs = "%s %s %s < %s >> %s" % (arg1, arg2, arg3, impFilePath, rptFilePath)
impResult = call(["mycmd ", impArgs])

我用过

impCmd = "mycmd  %s %s %s < %s >> %s" % (arg1, arg2, arg3, impFilePath, rptFilePath)
impResult = call(impCmd, shell = True)

shell = True解决了问题,结果代码为0并执行了命令。