web-dev-qa-db-ja.com

Windowsはsubprocess.call()でファイルを見つけることができません

次のエラーが表示されます。

WindowsError: [Error 2] The system cannot find the file specified

私のコードは:

subprocess.call(["<<executable file found in PATH>>"])

Windows 7、64ビット。 Python 3.x最新、安定。

何か案は?

おかげで、

84
Sri

コマンドがシェル組み込みの場合、呼び出しに「Shell = True」を追加します。

例えば。 dirの場合、次のように入力します。

import subprocess
subprocess.call('dir', Shell=True)

ドキュメントから引用するには:

WindowsでShell = Trueを指定する必要があるのは、実行するコマンドがシェルに組み込まれているときだけです(例:dirまたはcopy)。バッチファイルまたはコンソールベースの実行可能ファイルを実行するためにShell = Trueは必要ありません。

152

Windowsでは、Shell=Trueを渡さない限り、subprocessモジュールはPATHを検索しません。ただし、プログラムの外部からの引数を渡す場合、Shell=Trueはセキュリティリスクになる可能性があります。 subprocessにもかかわらず正しい実行可能ファイルを見つけることができるようにするには、 shutil.which を使用できます。 PATHの実行可能ファイルの名前がfrobであるとします:

subprocess.call([shutil.which('frob'), arg1, arg2])

(これはPython 3.3以降で動作します。)

21
ptomato

Windowsでは、cmd.exeを介して呼び出す必要があります。 Apalalaが述べたように、Windowsコマンドは、別個の実行可能ファイルとしてではなく、cmd.exeに実装されます。

例えば.

subprocess.call(['cmd', '/c', 'dir'])

/ cはcmdにfollowコマンドを実行するよう指示します

これは、シェル注入を許可するShell = Trueを使用するよりも安全です。

13
Sam Inverso

Powershellを使用している場合は、その中にsubprocess.call(['powershell','-command','dir'])が含まれます。 PowershellはPOSIXコマンドの大部分をサポートしています

2
Darksnake

ドキュメントから引用するには:

「Python 3.5より前、これらの3つの関数はサブプロセスに対する高レベルAPIで構成されていました。多くの場合run()を使用できますが、既存のコードの多くはこれらの関数を呼び出します。」

SO:subprocess.callの代わりにPython 3.5以降でsubprocess.runを使用してください

0
Adrian Berca