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


103

次のエラーが発生します。

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

私のコードは:

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

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

何か案は?

おかげで、


そして、この実行可能ファイルは何ですか?
SilentGhost 2010年

Android SDKの「android」実行可能部分
Sri

2
そして、されている PATHに利用可能
スリランカ

コマンドラインから実行できますか?
SilentGhost 2010年

私が達成しようとしていることの小さな背景。これはOpendevice-HTML5アプリをデバイス固有のアプリに変換するオープンソースプロジェクト用です。bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/…の os.system()をsubprocess.call()に置き換えようとしています
Sri

回答:


178

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

たとえば、dir次のように入力します。

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

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

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


14
これdir.exe/bin/ls、* nixにaがある間、呼び出される実行可能ファイルがないためです。dir実装されるCMD.EXE多くのようcdで実装されるのbash
アパララ2011年

1
これはお勧めできません。docs.python.org/2/library/...
NUエベレスト

11
@nueverest コマンド文字列が外部入力から作成された
Jirka

代替手段(外部入力に対してより安全)は、PATHからを取得しos.environて手動で検索することです。
asmeurer 2017

この問題のはるかに適切な解決策については、stackoverflow.com / a / 32799942/3912576を参照してください。
SimonBiggs

33

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

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

(これはPython 3.3以降で機能します。)


4
Python 2オプションはありますか?
Naramsim、

1
あなたは正しい、そしてあなたはそれを修正する正しい方法を提案しています。この答えは受け入れられるべきです。現在受け入れられている答えは原因を説明しておらず、場合によっては危険である可能性のある修正を提案しています。
David FerenczyRogožan19年1

18

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

例えば

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

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

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


画面を開いたままにするにはどうすればよいですか?
ムーンドラ、

2
@Moondra、私があなたを正しく理解しているなら、の/k代わりに試してください/ccmd /?詳細については、コマンドラインで入力してください。
User5910 2018

@ User5910ありがとうございます。機会がありましたらお試しください。
Moondra

3

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


2

頭をひっかいた後、64ビットマシンで32ビットバージョンのpythonを実行しているときにC:\ Windows \ System32 \にあるファイルを実行すると、Windowsがプロセスをスマート化しようとするため、潜在的な問題であることがわかりました。 C:\ Windows \ System32への呼び出しをC:\ Windows \ SysWOW64にリダイレクトします。

これを修正する方法の例をここに見つけました:http : //code.activestate.com/recipes/578035-disable-file-system-redirector/


1

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

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

SO:Python 3.5以降では、subprocess.callの代わりにsubprocess.runを使用します


真実で役立つ。
エリックG.ハグストロム

0

PHPを呼び出しているときにも同じ問題が発生しました。その理由は、PHPがPATHにないため、PHPコマンドが見つからなかったためです。しかし、PowerShellはそれが現在の場所に存在することを検出し、このコマンドを信頼する場合は、 'PHP'を '。\ PHP'で置き換えることを提案します。その後、それはうまくいきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.