Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python脚本从终端执行,但在使用子进程时不执行?_Python_Python 2.7_Subprocess - Fatal编程技术网

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']
    与runnning
    trace.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