Popen错误:[Errno 2]没有这样的文件或目录

时间:2012-03-29 23:38:33

标签: python subprocess popen

我有一些自定义命令。

# works 
subprocess.Popen(['python'], stdout=subprocess.PIPE)

但如果我有自己的系统命令,如deactivate,我就会收到错误

Traceback (most recent call last):
  File "runner2.py", line 21, in <module>
    main() 
  File "runner2.py", line 18, in main
    subprocess.Popen(['deactivate',], stdout=subprocess.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

更别说我需要在我的沙箱virtualenv下执行此操作。

4 个答案:

答案 0 :(得分:95)

尝试在Popen调用中添加额外参数'shell = True'。

答案 1 :(得分:30)

请注意。 shell=True可能是op的正确解决方案,因为它们没有出现以下错误,但是如果不从参数中拆分可执行文件,也可以获得“No such file or directory”错误。< / p>

import subprocess as sp, shlex
sp.Popen(['echo 1']) # FAILS with "No such file or directory"
sp.Popen(['echo', '1']) # SUCCEEDS
sp.Popen(['echo 1'], shell=True) # SUCCEEDS, but extra overhead
sp.Popen(shlex.split('echo 1')) # SUCCEEDS, equivalent to #2

如果没有shell=True,Popen希望可执行文件是args的第一个元素,这就是它失败的原因,没有“echo 1”可执行文件。添加shell=True会调用您的系统shell并将args的第一个元素传递给shell。即对于Linux,Popen(['echo 1'], shell=True)相当于Popen('/bin/sh', '-c', 'echo 1'),这比您可能需要的开销更大。有关shell=True实际有用的案例,请参阅Popen() documentation

答案 2 :(得分:3)

您必须提供程序deactivate的完整路径,然后子进程模块才能找到它。

答案 3 :(得分:0)

我正在产生这样的子过程:

SHUTDOWN_CMD = os.path.sep.join(["c:", "windows", "system32", "shutdown.exe"])

def abortShutdown():
    os.spawnv(os.P_NOWAIT, SHUTDOWN_CMD,
        [SHUTDOWN_CMD, '/A'])
    time.sleep(3)

我没有使用子进程,因为Python 2.5不支持它。我不得不使用FULL路径让它工作,我猜你还必须使用自定义命令的完整路径。