5

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() メソッドが使用するのに適していることを示唆しています。

4

1 に答える 1

2

これは Python の問題ではありません。私のファイアウォール設定は実行可能ファイルを「サンドボックス化」していたため、出力は警告やエラーなしで破棄されました。

それらが実行されないようにする方が理にかなっているでしょう。別のファイアウォール ソフトウェアを使用する必要があると思います。

于 2012-10-06T13:33:36.213 に答える