2

一連のコマンドを受け取って実行するツールを作成しています。

コマンドは、ターミナル/コンソールで入力されたかのように記述されます。そのために、端末/コンソールで誰かが入力する動作を模倣するために soを使用Popen()しました。shell=True

ここで、ユーザーが好きなコマンド インタープリターを指定できるようにしたいと思います。より正確には、Windows では、cmd.exe の代わりに「Git bash」を使用することを決定できます。

Popen()のドキュメントによると、使用するインタープリターの選択は環境変数によって行われますCOMSPEC

呼び出しの前にに設定しようとしましCOMSPECたが、期待どおりにサブプロセスがコマンドにC:\Program Files (x86)\Git\bin\bash.exe追加されるため、失敗します。/cbase-c

使用しないことを考えshell=Trueましたが、違いが何であるか正確にはわかりません:

  • .split()コマンドラインを引数にする必要がありますか? もしそうなら、どのように?
  • shell=True/ setを意味するフラグはありますか?

ここでの目標は、Popen(shell=True)可能な限り模倣しながら、内部の「魔法」を再実装しないことです。

何かご意見は ?

4

1 に答える 1

7

shell=Trueほぼ普遍的に間違っていることであり、ここでも違いはありません。この場合、your_commandは bash による解析用に作成された文字列であり、次を使用します。

subprocess.Popen([r'C:\Program Files (x86)\Git\bin\bash.exe', "-c", your_command])

...そして、そのコマンドは、指定されたシェル (Git によって提供されるシェル) によってのみ解析されます。bashCOMSPECで使用するコマンドを生成するために、シェルによって解析される必要はありません。

于 2013-09-07T16:13:33.710 に答える