2

Windows XPでC30ツールチェーンを備えた粗いIDE(Microchip MPLAB)を使用しています。C コンパイラの出力は非常にノイズが多く、制御できません。出力ウィンドウで実際の警告やエラーを見つけるのは非常に困難です。

コンパイラの引数を受け取り、同じ引数でコンパイラを呼び出し、結果をフィルタリングしてstdoutに出力する Python スクリプトを作成したいと考えています。次に、ツールチェーン設定で、コンパイラの実行可能ファイルをスクリプトに置き換えることができます。IDE がスクリプトを呼び出し、フィルタリングされたコンパイラ出力を受け取ります。

コンパイラを実行するための私のコードは次のようになります。

arguments = ' '.join(sys.argv[1:])
cmd = '%s %s' % (compiler_path, arguments)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

問題は、スクリプトの実行時に引数からの引用符が消費されるため、IDE が次の引数でスクリプトを呼び出す場合:

main.c -o"main.o"

引数の値は

main.c -omain.o

最も明白な解決策は、引数リスト全体を引用符で囲むことですが、これには IDE のコンパイラ呼び出しコードを変更する必要があります。バッチ ファイルも使用してみましたが、9 つのパラメーター (%1 から %9) しか受け入れられず、コンパイラーは 15 個以上のパラメーターで呼び出されます。

スクリプトからプロセスにまったく同じ引数を転送する方法はありますか?

4

3 に答える 3

4

コマンド引数をリストとして Popen に渡します。

arguments = sys.argv[1:]
cmd = [compiler_path] + arguments
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2009-11-03T08:38:14.303 に答える
3

ChristopheD が言ったように、シェルは引用符を削除します。

しかし、Popen を使用する場合、文字列を自分で作成する必要はありません。自動的に処理できます。代わりにこれを行うことができます:

import sys, subprocess
process = subprocess.Popen(sys.argv[1:], executable=compiler_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

subprocess モジュールが引数を正しく渡してくれることを願っています。

于 2009-11-03T08:35:45.027 に答える
0

あなたのシェルは引用符を食べているので(Pythonスクリプトは引用符を受け取ることさえありません)、それらを「変更せずに」取得するのは非常に簡単ではないと思います。

于 2009-11-03T08:23:16.660 に答える