-2

私はPythonでこの奇妙な振る舞いに気づいています-私はプロセスからの出力を記録しようとしています、そして次にこの出力を読んでそれに対していくつかの処理をします。プログラムの実行後にファイルを開くと、ファイルにすべてのテキストが含まれていますが、何も読み取れません。

そのシンプルな

f=open("blah.txt",'w')
#I log the output of a program with subprocess
Cmdline="program.exe"
Dump= subprocess.Popen(CmdLine,stdout=f,stderr=subprocess.STDOUT)
#Waiting for it to finish
while(Dump.poll() is not None): #returns None while subprocess is running
        print "waiting on process to finish \n"
f.flush() #I flush everything to make sure it was written
sys.stdout.flush()
f.close()
#now i need to read from this file

f= open("blah.txt", 'r')
line=f.readline()
while line:
    print line
    line=f.readline()

f.close()

私はまったく何も読んでいませんが、プログラムの実行後にblah.txtファイルを開くと、すべてがそこにあります。私が間違っているかもしれないことについてのヒントはありますか?「プロセスが終了するのを待っています」からはまったく印刷されませんが、プロセスの実行には約1秒かかります。

4

2 に答える 2

4

ダンププロセスが完了するまで待ちます。

Dump= subprocess.Popen(CmdLine,stdout=f,stderr=subprocess.STDOUT)
#Waiting for it to finish
Dump.wait() # or -> while(Dump.poll() is None): print...

何が起こるかというと、待機ループが間違っているため、ポーリングの前にプロセスを開始するように変更しないので、ファイルを閉じる/開く前に開始するのを待つことはありません。

于 2013-03-26T00:20:55.087 に答える
1

あなたのコードのエラーはこの部分です

while(Dump.poll() is not None): # While dump.pool is not None keep the loop going

そのはず

while(Dump.poll() is None): # While dump.pool is None keep the loop going

whileループでDump.poll()は、None以外の場合は、基本的にループを継続します。問題はDump.pool()、プロセスが完了するまでNoneを返すことです。つまり、プロセスからの出力をキャッチする前に、whileループがすぐにキャンセルされます。

これは、意図したとおりに機能していることを確認したコードの更新バージョンです。

with open("blah.txt",'w') as w:
    #I log the output of a program with subprocess
    Cmdline="program.exe"
    Dump = subprocess.Popen(CmdLine,stdout=w,stderr=subprocess.STDOUT)
    #Waiting for it to finish
    while(Dump.poll() is None): #returns None while subprocess is running
        print "waiting on process to finish \n"
    w.flush() #I flush everything to make sure it was written
    sys.stdout.flush()

#now i need to read from this file
with open("blah.txt", 'r') as f:
    line=f.readline()
    while line:
        print line
        line=f.readline()

また、 withキーワードを使用して、タスクの完了後にファイルが常に適切に閉じられるようにすることをお勧めします。

于 2013-03-26T00:13:08.383 に答える