2016-12-08 4 views
1

私は、それはそれはまたそれが行われた場合subprocess.check_callのstderrがstderrストリームとstdoutストリームの両方を受信するのはなぜですか?

sys.stdout.write(progress_string) 

を使用してパーセントの進捗状況を出力

print message_string 

を使用して、いくつかのメッセージを出力Pythonスクリプト(my_python_script.pyそれを呼び出す)、いくつかの統計情報を出力し、Iためてきました後、私は別のスクリプトでは、私はAを呼び出し、今

sys.stderr.write(stats_string) 

を使用し、stderrを経由してファイルのものを収集したいです驚いたことに、この

file_obj = open('stats.log', 'a') 
check_call(['my_python_script.py'], stderr=file_obj) 
file_obj.close() 

のようなsubprocess.check_call()とのBOVEスクリプトは、file_objprint出力、sys.stdout.write出力とsys.stderr.write出力などmy_python_script.pyからのすべての出力が含まれています。私はそれがsys.stderr.writeからの出力しか含んでいないと思った。

なぜこれが当てはまりませんか? check_callはデフォルトでstderrstdoutにリダイレクトされますか?

簡単な修正がある場合、私は幸せなキャンピングカーになります。ありがとう。

ところで、私はLinux FedoraでPython 2.7を使用しています。

+0

あなたのスクリプトに 'sys.stdout.fileno()'と 'sys.stderr.fileno()'と同じものが出ていたら? –

答えて

0

心からの謝罪を印刷しています!

これは私の間違いでした。

このエラーの鍵は2倍でした。それが意図的であるが、問題の一部 -

パート1は、この定義

file_obj = open('stats.log', 'a') 

お知らせ「A」でした。次に、完了後に結果ファイルを削除するのを忘れました(一時的になっていて、最後に別の場所にコピーされます)。このため、すべてのテストはこのファイルに蓄積されていましたが、最初はstdoutを使用しました。

Oh lord。だから問題は:私は元の質問を削除すべきか、それとも説明のために役立つか?今はそんなに馬鹿だ。

+0

私はこの質問を削除します。なぜなら、将来の訪問者には役に立たないからです。結果をお知らせいただきありがとうございます。 –

+0

私は試しましたが、許可されませんでした。代わりに、私は司会者の注意を喚起した。 –

0

あなたにも標準出力オプションを追加してみてくださいすることができます

check_call(['my_python_script.py'], stdout=anotherfile_obj, stderr=file_obj) 

私の推測では、check_callstdoutが指定されていないときstderrstdoutとして治療されていることです。

どちらかその、またはスクリプトは、デフォルトでstderrにコミュニティに

+0

試したstdout = PIPE。うまく行かなかった。 –

+1

[PIPE]は最良のテストではないかもしれません。[ドキュメントは 'check_call'で明示的に警告します。](https://docs.python.org/2/library/subprocess.html#subprocess.check_call) –

+0

I知っている。デッドロックする可能性があります。しかし、それはあなたの理論をテストするための素早い方法でした;-) –

関連する問題