カスタムコマンドがいくつかあります。
# 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でこれを実行する必要があります。
Popen
呼び出しに追加のパラメーター「Shell = True」を追加してみてください。
ちょっとだけ。 _Shell=True
_はo.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の最初の要素と見なします。これが失敗する理由です。「エコー1」実行可能ファイルはありません。 _Shell=True
_を追加すると、システムシェルが呼び出され、args
の最初の要素がシェルに渡されます。つまり、Linuxの場合、Popen(['echo 1'], Shell=True)
はPopen('/bin/sh', '-c', 'echo 1')
と同等であり、必要以上にオーバーヘッドが大きくなります。 _Shell=True
_が実際に役立つ場合については、 Popen()documentation を参照してください。
あなたはあなたのプログラムへのフルパスdeactivate
を与えなければならず、それからサブプロセスモジュールはそれを見つけることができるはずです。
私はそのようなサブプロセスを生成しています:
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はサポートしていないため、サブプロセスを使用していません。フルパスを使用して動作させる必要があり、カスタムコマンドへのフルパスも使用する必要があります。