1

Python からシェル スクリプトを実行しようとしましたが、代わりに

WindowsError: [Error 193] %1 is not a valid Win32 application

私の簡略化されたコードは次のとおりです。

import subprocess
subprocess.call(["%s/scripts/test.sh"%work_path, "arg1", "arg2"])

奇妙なことに、これは Linux でスムーズに動作します。

test.shヘッダーに bash への有効なパスがあり、bash 実行可能ファイルが に含まれてい%PATH%ます。parameter を使用しようとしましshell=Trueたが、結果は同じです。

4

3 に答える 3

2

私も同じ問題を抱えていました。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 に出力を戻す方法がわかりません。これは出力を印刷しますが、メインプロセスには送り返しません。呼び出し元のプログラムに結果を返す必要がありますが、それはおそらく、出力パイプとファイルのリダイレクトに関するまったく別の問題です。

要するに。完全に混乱していますが、スクリプトは実行されます。確かに、どこかにもっと一貫したテクニックがあります。

于 2015-08-14T18:33:48.087 に答える
0

以下は私にとってはうまくいきます:

import platform, os, subprocess

if platform.system() == 'Windows':
    programfiles = ('PROGRAMW6432' if platform.architecture()[0] == '32bit'
                    else 'PROGRAMFILES')
    bash_exe = os.getenv(programfiles) + r'\Git\bin\bash'
    subprocess.call([bash_exe, '-c', 'echo hello'])
于 2016-04-04T13:31:28.300 に答える