6

更新:subprocess.callの代わりにを使用するsubprocess.Popenと、問題は解決されます。原因を知っている人はいますか? そして、別の問題が発生しました:出力を制御する方法が見つからないようです...出力をsubprocess.call文字列などにリダイレクトする方法はありますか? ありがとう!

プロジェクトのビルドに使用しようとしてDevenvいますが、コマンド プロンプトに次のように入力すると問題なく動作しますdevenv A.sln /build "Debug|Win32"が、python を使用して上記と同じ行のPopen(cmd,shell=true)whereを使用して実行すると、何も表示されません。cmdを削除し|てのみに変更すると"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、完全に機能します..

ここにコメントをありがとう

4

5 に答える 5

5

と には違いがありますdevenv.exedevenv.comどちらも実行可能で、同じディレクトリに存在します (ため息)。質問で使用されているコマンドラインと一部の回答では、どちらが必要かがわからないため、どちらが使用されるかわかりません。

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

于 2009-07-09T16:34:56.673 に答える
1

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

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

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

于 2011-12-08T22:00:24.133 に答える
0

を使用するshell = Falseと、文字列が 1 つのコマンドとして扱われるため、コマンド/引数をリストとして渡す必要があります。

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
于 2009-07-05T19:02:02.600 に答える
0

'devenv A.sln /build "Debug|Win32"' のように二重引用符で囲みます。

于 2009-06-26T15:35:30.837 に答える
0

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

于 2009-06-26T15:36:43.377 に答える