我正在尝试从Python Windows应用程序中运行一个Python文件。为此,我使用了
使用PIPE:
subprocess
。为了在应用程序控制台上获取实时流输出,我尝试了以下语句。使用PIPE:
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, shell=True)
for line in iter(p.stdout.readline, ''):
print line
(或)
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
除了上面的代码外,我尝试了很多方法,但结果都像下面一样:
1. Python窗口应用程序运行时间过长
2. 然后应用程序窗口长时间处于“未响应”状态
3. 然后整个输出被打印到控制台上
我知道Python应用程序中正在发生缓冲区溢出,因此我无法获取实时输出。
我已经发布了很多关于这个问题的查询,但仍然没有得到解决方案。
刚刚找到并尝试了tempfile。但我不确定它是否会提供实时流式输出。
我应该尝试这种方式吗?
import tempfile
import subprocess
w = tempfile.NamedTemporaryFile()
p = subprocess.Popen(cmd, shell=True, stdout=w,
stderr=subprocess.STDOUT, bufsize=0)
with open(w.name, 'r') as r:
for line in r:
print line
w.close()
有没有其他最佳解决方案来实现 Windows 应用程序上无阻塞、非缓冲的实时输出。
希望能得到任何帮助。
注意:
- 我想要运行的 Python 文件具有更多的打印语句(即更多内容)。
- Windows Server 2012,Python 2.7。
sys.stdout.flush()
属性会出现错误。AttributeError: 'TextCtrl' 对象没有 'flush' 属性
。而且 Python 应用程序的行为没有任何改变 :-( - Nithyasys.stdout.flush()
语句会发生什么? - John Lunzersys.stdout
,因为sys.stdout
的原始值__应该__具有flush
方法。我对发布的代码进行了编辑,将使用 stdout 的原始值。请尝试一下。 - John Lunzer