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
Python IOError 中的错误:[Errno 2] 没有这样的文件或目录:'data.csv' [重复]