次のエラーが発生します。
WindowsError: [Error 2] The system cannot find the file specified
私のコードは:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7、64ビット。Python 3.x最新、安定版。
何か案は?
おかげで、
次のエラーが発生します。
WindowsError: [Error 2] The system cannot find the file specified
私のコードは:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7、64ビット。Python 3.x最新、安定版。
何か案は?
おかげで、
回答:
コマンドがシェル組み込みの場合は、呼び出しに「shell = True」を追加します。
たとえば、dir次のように入力します。
import subprocess
subprocess.call('dir', shell=True)
ドキュメントから引用するには:
Windowsでshell = Trueを指定する必要があるのは、実行するコマンドがシェルに組み込まれているときのみです(たとえば、dirまたはcopy)。バッチファイルまたはコンソールベースの実行可能ファイルを実行するために、shell = Trueは必要ありません。
dir.exeは/bin/ls、* nixにaがある間、呼び出される実行可能ファイルがないためです。dir実装されるCMD.EXE多くのようcdで実装されるのbash。
PATHからを取得しos.environて手動で検索することです。
Windowsでは、裏で使用しているため、パスsubprocessしPATHない限りshell=True、モジュールはを調べませんCreateProcess()。ただし、shell=Trueプログラムの外部から来る可能性のある引数を渡す場合は、セキュリティ上のリスクになる可能性があります。ようにするにはsubprocess、正しい実行ファイルを見つけることができるにもかかわらず、あなたが使用することができますshutil.which。の実行可能ファイルのPATH名前がfrob次のとおりだとします。
subprocess.call([shutil.which('frob'), arg1, arg2])
(これはPython 3.3以降で機能します。)
Windowsでは、cmd.exeを介して呼び出す必要があります。Apalalaが述べたように、Windowsコマンドは個別の実行可能ファイルとしてではなく、cmd.exeに実装されています。
例えば
subprocess.call(['cmd', '/c', 'dir'])
/ cは、cmdにfollowコマンドを実行するように指示します
これは、shell注入を許可するshell = Trueを使用するよりも安全です。
/k代わりに試してください/c。cmd /?詳細については、コマンドラインで入力してください。
頭をひっかいた後、64ビットマシンで32ビットバージョンのpythonを実行しているときにC:\ Windows \ System32 \にあるファイルを実行すると、Windowsがプロセスをスマート化しようとするため、潜在的な問題であることがわかりました。 C:\ Windows \ System32への呼び出しをC:\ Windows \ SysWOW64にリダイレクトします。
これを修正する方法の例をここに見つけました:http : //code.activestate.com/recipes/578035-disable-file-system-redirector/
ドキュメントから引用するには:
「Python 3.5より前のバージョンでは、これら3つの関数はサブプロセス用の高レベルAPIで構成されていました。多くの場合、run()を使用できますが、既存のコードの多くがこれらの関数を呼び出します。」
SO:Python 3.5以降では、subprocess.callの代わりにsubprocess.runを使用します