0

我正在尝试执行如下脚本“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

知道这里可能有什么问题吗?

4

3 回答 3

0

文档

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

于 2013-05-02T08:39:48.177 回答
0

尝试设置参数shell=True:

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

解释:没有你尝试执行名为的脚本python test.py ...

您也可以尝试将 verifygerritscmd 定义为列表:

verifygerritscmd = ['/usr/bin/python', 'test.py', 'argument1', 'argument2' ... ]
于 2013-05-02T08:33:36.080 回答
0

文档中:

args 应该是一系列程序参数或单个字符串。默认情况下,如果 args 是一个序列,则要执行的程序是 args 中的第一项。如果 args 是字符串,则解释取决于平台,如下所述。有关与默认行为的其他差异,请参阅 shell 和可执行参数。除非另有说明,否则建议将 args 作为序列传递。

这意味着您需要这样做:

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

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

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

此外,您应该确保您的路径是正确的。使用 subprocess 模块时,最好不要对使用的路径模棱两可。所以调用“test.py”可能应该改为“/path/to/test.py”

于 2013-05-02T09:19:20.847 回答