Python脚本从终端执行,但在使用子进程时不执行?
我正在使用Python脚本从终端执行,但在使用子进程时不执行?,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,我正在使用subprocess执行一个名为trace.py的Python脚本,该脚本位于不同的文件夹中。脚本trace.py然后使用子流程运行traceroute命令,然后打印输出。当我转到trace.py所在的文件夹并在终端中键入以下内容时: python trace.py 或 或从任何地点: python /home/.../cgi-bin/trace.py 它工作正常,跟踪路由打印到终端。但是,当我尝试使用子流程从main.py执行trace.py时,它似乎不起作用。我已经通过创建te
subprocess
执行一个名为trace.py的Python脚本,该脚本位于不同的文件夹中。脚本trace.py然后使用子流程运行traceroute命令,然后打印输出。当我转到trace.py所在的文件夹并在终端中键入以下内容时:
python trace.py
或
或从任何地点:
python /home/.../cgi-bin/trace.py
它工作正常,跟踪路由打印到终端。但是,当我尝试使用子流程从main.py执行trace.py时,它似乎不起作用。我已经通过创建test.py并使用subprocess从main.py执行它来测试了这一点,这是可行的。我这样做的原因如下:
output = subprocess.check_output([sys.executable, script_path])
其中script\u path
是指向trace.py
的绝对路径
我得到的全部错误是(路径缩短):
回溯(最近一次呼叫最后一次):
文件“/home/../cgi-bin/trace.py”,第11行,在
traceroute=子进程。检查输出([“traceroute”,“www.google.com”])
文件“/usr/lib/python2.7/subprocess.py”,第566行,在check_输出中
进程=Popen(stdout=PIPE,*popenargs,**kwargs)
文件“/usr/lib/python2.7/subprocess.py”,第710行,在__
错误读取,错误写入)
文件“/usr/lib/python2.7/subprocess.py”,第1327行,在执行子进程中
引发子对象异常
OSError:[Errno 2]没有这样的文件或目录
回溯(最近一次呼叫最后一次):
文件“main.py”,第97行,在
服务(args.port、public\u html、cgibin)
文件“main.py”,第55行,在serve中
进程=子进程。检查输出([“/usr/bin/python”,脚本路径])
文件“/usr/lib/python2.7/subprocess.py”,第573行,在check_输出中
引发被调用的进程错误(retcode,cmd,output=output)
subprocess.CalledProcessError:命令'['/usr/bin/python','/home/../cgi-bin/trace.py']'返回非零退出状态1
为什么这不起作用,但从终端执行却起作用?子级找不到traceroute
可执行文件
将shell中的os.environ['PATH']
与runnningtrace.py中的值进行比较
检查文件权限--运行trace.py
的用户是否可以读取和执行该文件
可以打印python trace.py--ip www.google.com的输出;echo$?
退出状态为1
。航站楼不感兴趣。尝试echo$?
查看它是否为1
@PeterWood退出状态为0。它是否真的是home/../cgi bin
。那看起来不对劲。script\u path
的值是多少?只是猜测一下:trace.py脚本可能要求当前工作目录位于它所在的位置(可能您导入了其他不在sys.path上的模块)。在执行之前告诉子流程要更改到哪个目录可能会有所帮助。另外,您没有显示的进程的输出可能有来自python的错误,这可以解释为什么它以错误状态退出?在终端中的python shell中打印os.environ[“PATH”]
,然后在trace.py
中打印,打印出同样的内容。@Esoemah:我已经更新了答案。如果文件权限看起来还行,那么创建一个最小的代码示例来演示您的问题并更新您的问题,例如,python-c'import subprocess,sys;subprocess.check_-call([sys.executable,“-c”,“import subprocess;subprocess.check_-call”([mtr”,“www.google.com]”)和““]”)
多亏了你,我才明白了这一点。就像你说的,这是一条路,当它是那么简单的时候,有那么多的挣扎。。。
output = subprocess.check_output([sys.executable, script_path])
Traceback (most recent call last):
File "/home/.../cgi-bin/trace.py", line 11, in <module>
traceroute = subprocess.check_output(["traceroute", "www.google.com"])
File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "main.py", line 97, in <module>
serve(args.port, public_html, cgibin)
File "main.py", line 55, in serve
process = subprocess.check_output(["/usr/bin/python", script_path])
File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['/usr/bin/python', '/home/.../cgi-bin/trace.py']' returned non-zero exit status 1