我有一些自定义命令。
# 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下执行此操作。
答案 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路径让它工作,我猜你还必须使用自定义命令的完整路径。