我正在尝试执行如下所示的脚本“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
知道这里有什么不对吗?
答案 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)
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”