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

Posted

技术标签:

【中文标题】Popen 错误:[Errno 2] 没有这样的文件或目录【英文标题】:Popen error: [Errno 2] No such file or directory 【发布时间】:2012-04-13 16:14:38 【问题描述】:

我有一些自定义命令。

# 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 下执行这个了。

【问题讨论】:

当您的脚本运行时,python 可能不在 PATH 环境变量中。尝试设置python的完整路径,即/usr/bin/python 你能解释一下你想要完成什么吗?我怀疑您使用 subprocess 启动的子 shell 没有“获取”virtualenv 激活脚本,并且它不是从父 Python 进程继承的(假设您从那里运行它)。 【参考方案1】:

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

【讨论】:

为我工作,但为什么? @YMomb: deactivate 是一个外壳函数。要运行它,您需要一个 shell。尽管尝试在新的 shell 中运行它是没有意义的(新的 shell 可能在调用 venv/bin/activate 之前不会定义它,并且如果 OP 希望停用当前的 virtualenv,孩子通常无法修改其父环境在父外壳中设置。这与subprocess.call('cd') 引发“没有这样的文件或目录”的原因相同,可以使用shell=True 修复它,同样毫无意义。参见Why is cd not a program?【参考方案2】:

只是一个注释。 shell=True 可能是该操作的正确解决方案,因为他们没有犯以下错误,但如果您不将可执行文件与其参数分开,您也可能会收到“没有此类文件或目录”错误。

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。

【讨论】:

如果您忘记在字符串文字之间放置逗号,则可能会出现此版本的错误,因为 Python 会将它们连接起来:sp.Popen(['echo' '1']) # FAILS 它应该是 import shlex,因为 shlex 是它自己的 python standard package。 如果命令(第一个参数)中有空格,您甚至会收到此错误。例如,这将失败:sp.Popen(['echo ', '1']) 注意“echo”后面的空格...很容易错过。【参考方案3】:

我正在生成这样的子进程:

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 不支持它。我必须使用完整路径才能使其正常工作,我猜您还必须使用自定义命令的完整路径。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Popen 错误:[Errno 2] 没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

Open3.popen3 在 Windows 上返回错误错误 Errno::ENOENT

OSError: [Errno 8] 执行格式错误

操作系统错误:没有这样的文件或目录,errno = 2

Python IOError 中的错误:[Errno 2] 没有这样的文件或目录:'data.csv' [重复]

气流 SSH 操作错误:[Errno 2] 没有这样的文件或目录:

FileSystemException:无法检索文件长度(操作系统错误:没有这样的文件或目录,errno = 2)