3

私は単純なpythonプログラムを持っています:

test.py:

import time
for i in range(100000):
    print i
    time.sleep(0.5)

上記のプログラムがカウントしている間に最後の行の出力を読み取るために、上記のプログラムを実行する別のプログラムを使用したいと考えています。

import subprocess

process = subprocess.Popen("test",stdout=PIPE)
sleep(20) # sleeps an arbitrary time
print stdout.readlines()[-1]

問題は、process.stdout.readlines()test.py の実行が終了するまで待機することです。プログラムの実行中に出力に書き込まれた最後の行を読み取る方法はありますか?

4

2 に答える 2

3

collections.deque最後に指定された行数のみを保存するために使用できます。

#!/usr/bin/env python
import collections
import subprocess
import time
import threading

def read_output(process, append):
    for line in iter(process.stdout.readline, ""):
        append(line)

def main():
    process = subprocess.Popen(["program"], stdout=subprocess.PIPE)
    # save last `number_of_lines` lines of the process output
    number_of_lines = 1
    q = collections.deque(maxlen=number_of_lines)
    t = threading.Thread(target=read_output, args=(process, q.append))
    t.daemon = True
    t.start()
    #
    time.sleep(20)

    # print saved lines
    print ''.join(q),
    # process is still running
    # uncomment if you don't want to wait for the process to complete
    ##process.terminate() # if it doesn't terminate; use process.kill()
    process.wait()

if __name__=="__main__":
    main()

出力の一部のみを印刷する他の尾のようなソリューションを参照してください

子プログラムが非対話的に実行しているときに標準出力に (ライン バッファリングではなく) ブロック バッファリングを使用している場合は、こちらを参照してください。

于 2012-11-11T14:30:39.813 に答える
1

sh.pyでかなり簡単:

import sh

def process_line(line):
    print line

process = sh.python("test.py", _out=process_line)
process.wait()
于 2012-11-12T06:02:14.763 に答える