web-dev-qa-db-ja.com

Popenエラー:[Errno 2]そのようなファイルまたはディレクトリはありません

カスタムコマンドがいくつかあります。

# 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でこれを実行する必要があります。

43
user1012451

Popen呼び出しに追加のパラメーター「Shell = True」を追加してみてください。

96
Anthony Kong

ちょっとだけ。 _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 を参照してください。

34
Mark Woodward

あなたはあなたのプログラムへのフルパスdeactivateを与えなければならず、それからサブプロセスモジュールはそれを見つけることができるはずです。

3
Senthil Kumaran

私はそのようなサブプロセスを生成しています:

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はサポートしていないため、サブプロセスを使用していません。フルパスを使用して動作させる必要があり、カスタムコマンドへのフルパスも使用する必要があります。

0
katzenversteher