2016-07-25 8 views
0

私はオートメーションプロジェクトで作業中にちょっとした問題に遭遇しました。"mode"はpython 3.5のサブプロセスでは実行されません

私が実行しようとすると:

program = subprocess.run("mode") 

を私が手:

FileNotFoundError: [WinError 2] The system cannot find the file specified 

私はIPCONFIGでモードを交換するときしかし、:

program = subprocess.run("ipconfig") 

それは完全に罰金実行されます。

誰でも説明がありますか?私は現在、バッチファイルを使用してmodeコマンドを実行していますが、バッチファイルを編集せずに引数を変更したいと思います。

編集1:

os.system("mode") 

とも働いたこと:

私もちょうどos.systemを使用してみました。

編集2:

今、私は元の問題への答えのようにちょうど何が起こっていたかを理解するでしょう。

+0

'shell = True'が必要な場合がありますか? –

+0

@Wayne Wernerだから、私はPopenでそれを試して、真実にシェルを設定し、それも働いた。あなたはそれがなぜそんなにうまくいくのか何か手がかりはありますか?ありがとう! – FlyingLightning

答えて

1

Actual meaning of 'shell=True' in subprocessshell=Trueは、あなたが恥ずかしがっているはずのものです。

FileNotFoundError: [WinError 2] The system cannot find the file specified 

はあなたのサブプロセスの呼び出しでshell=Trueを望むかもしれないことを私にチップオフするものです。ファイルが見つからない場合は、次のいずれかを意味します。

  1. あなたのパスにはありません。
  2. 実際にはのファイルではありません。 Linuxでは例えば

、:なしechoファイルがあること、それはかなり明白になり

$ which echo 
echo: shell built-in command 

。それはシェルに組み込まれた単なるコマンドです。このでもWindowsではmodeと同じものになります。 this siteMODE.COMというファイルだと思われるようですが。あなたはのように、ことを起動しようとして働くことができる

subprocess.run('MODE.COM') 

- 少なくとも私はシェル経由で呼び出す

にリンクthe answersのいずれかに応じて環境変数を展開することができず、シェルの通常のメカニズムに従ってファイルグロブを実行します。 POSIXシステムでは、シェルはファイルグロブをファイルのリストに展開します。 Windowsでは、ファイルグロブ(例えば、「「)は、とにかく、シェルによって展開されていません(ただし、コマンドラインでの環境変数)はcmd.exeので展開される。

だからあなたの場合には、おそらくmodeはファイルではありませんが、MODE.COMです Windowsはケーシングとの間に些細な関係がありますので、shell=Trueを渡すと、Windowsシェルはmodeをうまく利用してMODE.COMに変換しますが、それがなければ、文字通りmodeという名前のファイルを実行しようとします。

関連する問題