次のエラーが発生します。
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を使用します