Pythonでのプロセスにコマンドライン引数を転送
-
13-09-2019 - |
質問
私は、Windows XP上のC30ツールチェーンで、粗IDE(マイクロチップ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+のパラメータで呼び出されます。
スクリプトから、正確にプロセスに同じ引数を転送する方法はありますか?
解決
あなたのシェルは引用符を食べている(Pythonスクリプトでもそれらを受け取ることはありません)ので、私はそれが変更されていない "それらを得ることは非常に簡単ではないと仮定します。
他のヒント
リストとしてpopenのにコマンド引数を付けます:
arguments = sys.argv[1:]
cmd = [compiler_path] + arguments
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
ChristopheDは、シェルが引用符を削除言ったように。
しかし、あなたはpopenのを使用している場合、文字列を自分で作成する必要はありません:それは自動的にあなたのためにそれを扱うことができます。あなたの代わりにこれを行うことができます:
import sys, subprocess
process = subprocess.Popen(sys.argv[1:], executable=compiler_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocessモジュールは、うまくいけば、あなたのために正しく引数を渡します。