私も同じ問題を抱えていました。MinGW(msysgit)でpythonからシェルスクリプトを実行する方法を次に示します。
from subprocess import call
arg1 = 1
arg2 = 10
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', '~/bin/myscript', arg1, arg2]
result_code = call(cmd)
重要なのは、最初の引数として bash.exe へのパスを明示的に記述し、2 番目の引数に「-c」(コマンド) を指定し、3 番目の引数としてスクリプトを使用することです。後続の引数はスクリプトに渡されます (場合によっては -- 以下を参照)。
いくつかの注意事項:
%PROGRAMFILES%
また、bash.exe ファイルを検索するときに、他の Windows 変数が解決されません。名前をハードコーディングするのではなく、python を使用してパスを作成することで、おそらくこれを回避できます。
mingw ホーム ディレクトリの ~ の置換が機能し、.bashrc
またはからの PATH 変数が機能し.profile
ます。「-c」引数を省略すると、(~ 内の) ローカル スクリプトにアクセスできますが、「true」や「ls」などのコマンドの mingw ルート ファイル構造は存在しません。
たとえば、引数をいつ結合し、いつ結合しないかをよく理解していません。たとえば、次のコマンドが機能します。
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', 'echo hi']
result_code = call(cmd)
しかし、これはしません:
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', 'echo', 'hi']
result_code = call(cmd)
ただし、私のシェルスクリプトでは、これは機能します:
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', '~bin/myscript', arg1, arg2]
result_code = call(cmd)
しかし、これはしません:
cmd = ['C:\\Program Files (x86)\\Git\\bin\\bash.exe', '-c', '~bin/myscript 1 10']
result_code = call(cmd)
いずれの場合も、bash.exe の実行が成功した場合、result_code は 0 です。スクリプトから Python に出力を戻す方法がわかりません。これは出力を印刷しますが、メインプロセスには送り返しません。呼び出し元のプログラムに結果を返す必要がありますが、それはおそらく、出力パイプとファイルのリダイレクトに関するまったく別の問題です。
要するに。完全に混乱していますが、スクリプトは実行されます。確かに、どこかにもっと一貫したテクニックがあります。