簡體   English   中英

Python:readline()使用Popen()調用進程時收到垃圾郵件

[英]Python: Junk received when readline() a process called with Popen()

我需要將文件的輸出流式傳輸到列表中,我獲得了正確的數據,但是最后卻有很多垃圾,並且不了解我在做什么錯。

(我認為很簡單)popen代碼是:

stream = []
p = Popen(["python", "-u", "test.py"], stdout=PIPE, bufsize=1)

while p.poll() is None:
    stream.append(p.stdout.readline())

print stream
print 'Returned: {0}'.format(p.returncode)

調用此命令的輸出是:

運行它的輸出是:

['[INDEX 0] Current index position\n', '[INDEX 1] Current index position\n', '[INDEX 2] Current index position\n', '[INDEX 3] Current index position\n', '[INDEX 4] Current index position\n', 'exiting.
...\n', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '', '', '', '', '']
Returned: -4

Test.py是:

index = 0

while True:
    print '[INDEX {0}] Current index position'.format(index)
    index += 1
    if index == 5: break

import sys
print 'exiting....'
sys.exit(-4)

這里的問題是您的if條件不正確:

while p.poll() is None:
    stream.append(p.stdout.readline())

這意味着“在進程運行時,請讀一行”。 但這不是您想要的。 您真正想要的是“當有更多輸出時,請讀一行”。 您編寫的代碼在進程關閉時讀取空行,因此所有空字符串都來自此行。

相反,您應該做的是:

for line in p.stdout:
    stream.append(line)

當沒有更多輸出時,這將正確停止讀取行,並保證讀取所有輸出。 (理論上,如果該過程產生的輸出比您處理它的速度更快,則您的代碼可能會在處理完所有輸出之前退出循環。您可以通過在循環中添加time.sleep(0.1)來模擬此過程。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM