2009-06-26 1 views
6

更新: の代わりにsubprocess.Popenを使用すると、問題は解決します。そして、別の問題が出てきました。出力を制御する方法が見つからないようです... subprocess.callの出力をそのような文字列にリダイレクトする方法はありますか?ありがとう!"Debug | Win32"の設定でDevenvを実行するPythonスクリプトを書くと、何もしません

私はプロジェクトをビルドするためにDevenvを使用しようとしている、と私はdevenv A.sln /build "Debug|Win32"のようなコマンドプロンプトに入力したときに、それがうまく動作します - が、私はcmdは上記と同じラインであるところPopen(cmd,shell=true)を使用してそれを実行するのpythonを使用する場合何も表示されません。 |を削除した場合は、"Debug"に変更してください。

これはなぜ起こるのですか?私は\|を入れて試してみたが、それでも何も起こらなかった。これは私が使用していたコードである

from subprocess import Popen, PIPE 

cmd = ' "C:\\Program Files\\Microsoft Visual Studio 8\\Common7\\IDE\\devenv" solution.sln /build "Debug|Win32" ' 

sys.stdout.flush() 
p = Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE) 
lines = [] 
for line in p.stdout.readlines(): 
    lines.append(line) 
out = string.join(lines) 
print out 
if out.strip(): 
    print out.strip('\n') 
    sys.stdout.flush() 

私はDebug|Win32を入れ替える場合は、しかし、動作しません... Debugと、それは完璧に動作します..ここですべてのコメントを

おかげ

+0

私の頭の中にポップアップしたちょっとした酔いどれ、ポピンはあなたが使ったか、あなたはインポートステートメントを表示できますか? –

+0

確かに、それはです: サブプロセスの輸入popenの、PIPE P = popenの(CMD、シェル= Trueの場合、STDOUT = PIPE、標準エラー出力= PIPE) cmdは「のようなものである "..(パス)/ devenvを" 溶液から/ビルド "デバッグ| Win32" ... それはようです| signはコマンド全体を無視します... –

+0

私は、 'devenv.com'コマンド全体を含んでいるPythonのコンパイル時にcompile.batファイルを作成し、' popen'を使ってPythonからcompile.batを実行すると、それが魅力的であることを発見しました。 –

答えて

0

shell = Falseが使用されている場合、あなたがリストとしてコマンド/ arugmentsを渡す必要があるので、それは、単一のコマンドとして文字列を扱いますが..ような何か:

from subprocess import Popen, PIPE 

cmd = [ 
    r"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv", # in raw r"blah" string, you don't need to escape backslashes 
    "solution.sln", 
    "/build", 
    "Debug|Win32" 
] 

p = Popen(cmd, stdout=PIPE, stderr=PIPE) 
out = p.stdout.read() # reads full output into string, including line breaks 

print out 
+0

実際に引数のリストは私のためには機能しません。実行するとdevenvのヘルプダイアログが表示され続け、最初の引数だけが呼び出されます。 しかし、shell引数で正しい意味を持っています。shell = Trueを無効にすると、元のコマンドラインが完全に機能します。 |には別の意味がなければなりません。シェルオプション付きだと思います。 ありがとう! –

0

は、二重引用符のようにしてみてください。 'devenvをA.sln /ビルド "デバッグ| Win32の"'

+0

実際に二重引用符で囲まれました。 –

0

Windowsのシェルのように見えるのは、パイプとして|を取ります(引用符とエスケープにもかかわらず)。代わりにshell=Falseを試しましたか?

+0

シェルをFalseに設定すると、出力が得られないように見えて、動作しているかどうかを確認できません。 shell = Falseのときに出力を得る方法を教えてください。おかげで –

+0

それは謎です - 私たちにコードの全体を表示してください、そうでなければそれは間違いなく1つあります;-)。 –

+0

シェルオプションが問題を引き起こしたことが判明しました。なぜ私は最初のthoで出力を得ることができなかったかわからない。ありがとう!! –

4

devenv.exe間の違いがありますし、 devenv.com、どちらも実行可能であり、同じディレクトリにあります(sigh)。質問に使用されるコマンドラインといくつかの答えは、どちらが必要なのかを言わないので、どちらが使われるのか分からない。

コマンドラインから呼び出したい場合は、devenv.comを使用する必要があります。そうしないと、GUIがポップアップする可能性があります。私はこれが混乱のいくつか(しかしすべてではない)の原因かもしれないと思う。

+2

これは私のために働いた。私は上記の 'devenv'を 'devenv.com'に変更し、それがすべて働き始めました。 – gman

1

セクション17.1.5.1を参照してください。 Pythonのドキュメントを参照してください。

Windowsでは、Pythonは自動的にプロジェクト設定引数の前後に二重引用符を追加します。つまり、Debug | win32はdevenvに "Debug | win32"として渡されます。二重引用符を追加する必要はなく、PopenにTrueを渡す必要はありません。

devenvに渡される引数文字列を表示するには、ProcMonを使用します。

関連する問題