我想要实现一个调用另一个脚本并捕获其标准输出的python脚本.被调用的脚本将包含一些输入和输出消息,例如
print ("Line 1 of Text")
variable = raw_input("Input 1 :")
print "Line 2 of Text Input: ", vairable
我正在运行的代码部分是
import subprocess
cmd='testfile.py'
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
so, se = p.communicate()
print(so)
发生的问题是stdout直到脚本执行后才打印.这会留下空白提示,等待用户输入.有没有办法让stdout在被调用脚本仍在运行时打印?
谢谢,
解决方法:
这里有两个问题.
>首先,python将输出缓冲到stdout,你需要阻止它.您可以像在Ilia Frenkel建议的那样在testfile.py中插入对sys.stdout.flush()的调用,或者您可以使用python -u来执行带有无缓冲I / O的testfile.py. (参见Ilia链接的other stack overflow question.)
>您需要一种从子进程异步读取数据的方法,然后在准备好输入时,打印您已读取的数据,以便显示用户的提示.为此,拥有asynchronous version of the subprocess module将是非常有帮助的.
我下载了异步子进程并重新编写了脚本以使用它,并使用python -u来获取无缓冲的I / O:
import async_subprocess as subprocess
cmd = ['python', '-u', 'testfile.py']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
so = p.asyncread()
print so,
(so, se) = p.communicate()
print so
当我使用python -u运行此脚本时,我得到以下结果:
$python -u script.py
Line 1 of Text
Input 1:
并且脚本暂停,等待输入.这是期望的结果.
如果我输入一些内容(例如“Hullo”),我会得到以下内容:
$python -u script.py
Line 1 of Text
Input 1:Hullo
Line 2 of Text Input: Hullo
标签:python,subprocess,stdout
来源: https://codeday.me/bug/20190626/1291272.html