私は、すべてのオペレーティングシステムに適用可能なpopen(および関連するすべての関数)に関する一般的な質問を、PythonスクリプトまたはいくつかのCコードを記述し、コンソール(勝つかlinux)、私はすぐにプロセスからの出力を見ることができます。しかし、パイプにリダイレクトされたstdoutを持つフォークされたプロセスと同じ実行可能プログラムを実行すると、出力は親プロセスが読むことができるパイプに書き込まれる前に、通常4096バイトまでのどこかでバッファリングされます。サブプロセス出力をCまたはPythonでpopenでバッファリングすることをバイパスします
次のPythonスクリプトは、1024バイトのチャンクで出力を生成します
import os, sys, time
if __name__ == "__main__":
dye = '@'*1024
for i in range (0,8):
print dye
time.sleep(1)
前のスクリプトを実行し、それがバイト
によってパイプ、バイトに来るとすぐに出力を読み込みます次のPythonスクリプトimport os, sys, subprocess, time, thread
if __name__ == "__main__":
execArgs = ["c:\\python25\\python.exe", "C:\\Scripts\\PythonScratch\\byte_stream.py"]
p = subprocess.Popen(execArgs, bufsize=0, stdout=subprocess.PIPE)
while p.returncode == None:
data = p.stdout.read(1)
sys.stdout.write(data)
p.poll()
オペレーティングシステムのパスを調整します。この設定で実行すると、popenコマンドのバッファサイズが0に設定されているにもかかわらず、出力は1024のチャンクではなく、4096のチャンクで表示されます(これはデフォルトです)。誰も私にこの動作を変更する方法を教えてもらえますか?オペレーティングシステムがフォークされたプロセスの出力をコンソールから実行したときと同じように扱うようにする方法はありますか?バッファリングせずに?
-u、喜びはありませんが、見通しは有望そうですね、ありがとう! –
ちょうどフォローアップするには、pexpectは魅力のように動作し、wexpectはちょっとバギー(見つけにくい)ですが、仕事は終わります。これは私が最新バージョンのwexpectを見つけた場所です:http://sage.math.washington.edu/home/goreckc/sage/wexpect/ –
Gearoidに感謝します。特に、wexpectは最新のバージョンに更新されていませんcode.google.com home、なぜだろうか! –