Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python读取另一个程序的控制台输出_Python_Python 2.7_Subprocess_Stdout - Fatal编程技术网

用Python读取另一个程序的控制台输出

用Python读取另一个程序的控制台输出,python,python-2.7,subprocess,stdout,Python,Python 2.7,Subprocess,Stdout,有两个程序-parent.py和myscript.py,如下所示。parent.py一直在控制台中打印消息。myscript.py需要访问parent.py打印的内容 parent.py: import time while 1: time.sleep(1) print "test" import subprocess p = None p = subprocess.Popen(['python', 'parent.py'], stdo

有两个程序-parent.py和myscript.py,如下所示。parent.py一直在控制台中打印消息。myscript.py需要访问parent.py打印的内容

parent.py:

import time

while 1:
     time.sleep(1)
     print "test"
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:

import time

while 1:
     time.sleep(1)
     print "test"
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.py中的代码替换为

print "Hello"
由于程序执行完毕,myscript.py还打印了“Hello”。所以我想除非parent.py的执行完成,否则myscript.py不会读取它。这是怎么回事

我还尝试用以下代码片段替换myscript.py中的循环:

for line in iter(p.stdout.readline, ''):
    print line
但仍然没有产出

我的问题是:如何让myscript.py动态读取parent.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])

作品另外,一个快速的问题(不确定这是一个快速的解决方法还是涉及到更复杂的方法):有可能通过运行程序实现同样的效果吗?我的意思是,在本例中-myscript.py执行parent.py,然后将输出返回给myscript。我希望提取已经运行的代码的控制台输出,并提取其输出。比如识别进程>获取进程id>从控制台获取输出。我应该单独问这个问题,还是可以调整脚本本身?@Krish:“已经在运行”案例(特别是当您无法控制流程如何启动时)是一个单独的问题:确保提供上下文和动机:您试图解决什么问题,以及为什么您认为拦截输出会有所帮助。