Python サブプロセスに関する別の質問で申し訳ありませんが、この質問に対する回答が見つかりませんでした。
Windows 7 64 ビットでサブプロセスを呼び出す Python コードに問題があります。サブプロセスの stdout がパイプに送信されると、出力は生成されません。サブプロセスは問題なく実行および終了するように見えますが、出力は生成されません。
編集: 同じコードが WinXP 32 ビットで正しく動作するため、質問のタイトルを更新しました。
# (listing 1)
from subprocess import *
#cmdline= (a valid command line)
proc = Popen(cmdline,shell=True,stdout=PIPE,stderr=PIPE)
out, err = proc.communicate()
print( out )
print( err )
これにより、出力が得られます
out:
err:
ただし、サブプロセスの出力がパイプされていない場合、期待どおりの出力が生成されます。
# (listing 2)
proc = Popen(cmdline,shell=True)
proc.communicate()
これにより、期待される出力がコンソールに表示されます。
実行可能ファイルが実際にその出力を stdout に書き込んでいると確信しています。C ソース コードがあり、次の行を追加しました。
fprintf(stdout, "HELLO");
ここでも、リスト 2 を実行すると「HELLO」が表示されますが、リスト 1 は表示されません。
また、新しい C++ 実行可能ファイルを作成し、それを cmdline から呼び出してみました。
#include <iostream>
int main()
{
std::cout << "HELLO" << std::endl;
}
同じことが引き続き発生します。リスト 2 を実行すると「HELLO」が表示されますが、リスト 1 は表示されません。
cmdline を「dir」に設定すると、リスト 1 とリスト 2 の両方で予期されることが起こります。ディレクトリの内容がコンソールに出力されます。
私が試したその他のこと: Python 3.3 と Python 2.7 (同じ結果)。bufsize=0 (同じ結果); proc.returncode をチェックします (予想どおり 0 です); stderr=PIPE を削除します (この場合、リスト 1 は予想どおり "err: None" を返します)。
EDIT - 私も試してみました = proc.stdout の代わりに communicate() メソッドと同じ結果が得られました。Python のドキュメントやその他の質問は、communicate() メソッドが使用するのに適していることを示唆しています。