运行外部python脚本时出现子进程错误

时间:2013-05-02 08:32:20

标签: python subprocess

我正在尝试执行如下所示的脚本“test.py”,但遇到以下错误。

import subprocess
from subprocess import Popen, PIPE, STDOUT
verifygerritscmd = ("python test.py --InputFile=list.txt --Project=location/code --branch=master")
gerritPipe = Popen(verifygerritscmd, stdout=PIPE, stderr=PIPE)
(output, error) = gerritPipe.communicate()
if error != "":
    print error
    raise IOError, "gerrit command %s failed" % (gerritCmd)
print output

错误:

Traceback (most recent call last):
  File "test_anoop.py", line 4, in <module>
    gerritPipe = Popen(verifygerritscmd, stdout=PIPE, stderr=PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

知道这里有什么不对吗?

3 个答案:

答案 0 :(得分:0)

尝试设置参数shell = True:

 gerritPipe = Popen(verifygerritscmd, stdout=PIPE, stderr=PIPE, shell=True)

解释:如果没有,您尝试执行名为python test.py ...

的脚本

您还可以尝试将verifygerritscmd定义为list:

verifygerritscmd = ['/usr/bin/python', 'test.py', 'argument1', 'argument2' ... ]

答案 1 :(得分:0)

来自docs

  

所有调用都需要args,并且应该是字符串或序列   程序参数。通常提供一系列论证   首选,因为它允许模块处理任何所需的   转义和引用参数(例如,允许文件中的空格   名)。 如果传递单个字符串,则任何一个shell都必须为True(请参阅   或者字符串必须简单地命名要执行的程序   没有指定任何参数。

答案 2 :(得分:0)

来自documentation

  

args应该是一系列程序参数,否则就是一个   串。默认情况下,要执行的程序是args中的第一项   如果args是一个序列。如果args是一个字符串,则解释为   平台依赖并在下面描述。查看shell和可执行文件   与默认行为的其他差异的参数。除非   除非另有说明,建议将args作为序列传递。

这意味着你需要这样做:

verifygerritscmd = ("python test.py --InputFile=list.txt --Project=location/code --branch=master").split()

创建args列表。或者您可以在Popen构造函数中指定shell=True

gerritPipe = Popen(verifygerritscmd, stdout=PIPE, stderr=PIPE, shell=True)

此外,您应该确保您的路径正确。使用子进程模块时,最好不要对所使用的路径不明确。所以调用“test.py”应该更改为“/path/to/test.py”