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

use*_*451 45 python subprocess popen

我有一些自定义命令.

# works 
subprocess.Popen(['python'], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

但是,如果我有自己的系统命令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
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*ong 99

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

  • 为我工作,但为什么? (46认同)
  • @YMomb:`deactivate`是一个shell函数.要运行它,您需要一个shell.虽然试图在一个新的shell中运行它是没有意义的(新的shell可能不会定义,直到调用`venv/bin/activate`并且孩子通常无法修改其父环境,如果OP希望停用父shell中设置的当前virtualenv.这就是为什么`subprocess.call('cd')`引发"没有这样的文件或目录"并且可以使用`shell = True`修复它的原因相同看不见[为什么cd不是程序?](http://unix.stackexchange.com/q/38808/1321) (8认同)

Mar*_*ard 35

只是一张纸条.shell=True可能是op的正确解决方案,因为它们没有出现以下错误,但如果不从参数中拆分可执行文件,也可以获得"无此文件或目录"错误.

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
Run Code Online (Sandbox Code Playgroud)

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


Sen*_*ran 5

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