簡體   English   中英

用Python讀取另一個程序的控制台輸出

[英]Read console output of another program in Python

有兩個程序 - parent.py和myscript.py,如下所示。 parent.py在控制台中保持打印消息。 並且myscript.py需要訪問parent.py打印的內容。

parent.py:

import time

while 1:
     time.sleep(1)
     print "test"

myscript.py:

import subprocess
p = None

p = subprocess.Popen(['python', 'parent.py'],
                 stdout=subprocess.PIPE,
                 stderr=subprocess.STDOUT,
                 )
for line in p.stdout:
       print line

我希望myscript.py動態地捕獲parent.py的輸出。 可以看出,parent.py有一個無限循環 - 腳本永遠不會停止,但每當它輸出單詞'test'時,myscript.py也應輸出相同的內容。 但myscript.py沒有給出任何輸出。

我嘗試用parent替換parent.py中的代碼

print "Hello"

程序完成執行后,myscript.py也打印出“Hello”。 所以我想除非parent.py的執行完成,否則myscript.py不會讀取它。 那是什么事嗎?

我也嘗試用這個片段替換myscript.py中的循環:

for line in iter(p.stdout.readline, ''):
    print line

仍然沒有輸出。

我的問題是:即使parent.py永遠不會完成執行,我如何讓myscript.py動態讀取parent.py正在打印的所有內容。

(我發現了類似的問題,但是它們要么不起作用,要么根本沒有答案。)

這是一個塊緩沖問題 :當stdout被重定向到管道parent.py在內部緩沖區(~4K-8K)中累積其輸出,即,在緩沖區溢出之前,您將看不到任何大約一個小時的內容。

要禁用緩沖,請傳遞-u命令行選項:

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE, STDOUT

script_path = os.path.join(get_script_dir(), 'parent.py')
p = Popen([sys.executable, '-u', script_path],
          stdout=PIPE, stderr=STDOUT, bufsize=1)
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print line,
p.wait()

看到:

注意:如果您不需要對輸出執行任何操作,則只需刪除stdout=PIPE ,即可在控制台中查看輸出:

subprocess.check_call([sys.executable, script_path])

暫無
暫無

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

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