如何强制Python的打印功能输出到屏幕?
这不是禁用输出缓冲的重复- 链接的问题是尝试无缓冲输出,而这是更一般的.这个问题的最佳答案太强大或涉及到这个问题(他们不是很好的答案),这个问题可以在谷歌上找到一个相对新手.
要从我的Python脚本启动程序,我使用以下方法:
def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = process.communicate()[0]
exitCode = process.returncode
if (exitCode == 0):
return output
else:
raise ProcessException(command, exitCode, output)
Run Code Online (Sandbox Code Playgroud)
因此,当我启动一个类似的过程时Process.execute("mvn clean install"),我的程序会一直等到过程结束,然后我才能获得程序的完整输出.如果我正在运行需要一段时间才能完成的过程,这很烦人.
我可以让我的程序逐行写入进程输出,通过在循环结束之前轮询进程输出或其他内容吗?
**[编辑]抱歉,在发布此问题之前我没有很好地搜索.线程实际上是关键.在这里找到一个示例,说明如何执行此操作:** 来自线程的Python Subprocess.Popen
我想subprocess.Popen()在Windows中使用rsync.exe,并在Python中打印stdout.
我的代码有效,但在文件传输完成之前它没有抓住进度!我想实时打印每个文件的进度.
现在使用Python 3.1,因为我听说它应该更好地处理IO.
import subprocess, time, os, sys
cmd = "rsync.exe -vaz -P source/ dest/"
p, line = True, 'start'
p = subprocess.Popen(cmd,
shell=True,
bufsize=64,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
for line in p.stdout:
print(">>> " + str(line.rstrip()))
p.stdout.flush()
Run Code Online (Sandbox Code Playgroud) 我试图从一个产生长而耗时的输出的过程中读取.不过,我想抓住它的输出为当它被生产.但是使用类似下面的东西似乎是在缓冲命令的输出,所以我最终得到了所有输出行:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print line
Run Code Online (Sandbox Code Playgroud)
我在MacOS 10.5上尝试这个
同样,同样的问题.
原因是 - 阅读以下内容后仍然无法使其正常工作:
我的情况是我有一个用C编写的控制台应用程序,让我们在循环中采用这个代码:
tmp = 0.0;
printf("\ninput>>");
scanf_s("%f",&tmp);
printf ("\ninput was: %f",tmp);
Run Code Online (Sandbox Code Playgroud)
它不断读取一些输入并写入一些输出.
我与它交互的python代码如下:
p=subprocess.Popen([path],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
p.stdin.write('12345\n')
for line in p.stdout:
print(">>> " + str(line.rstrip()))
p.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
到目前为止,每当我读取表单时,p.stdout它总是等待,直到进程终止然后输出一个空字符串.我尝试了很多东西 - 但结果仍然相同.
我尝试过Python 2.6和3.1,但版本没关系 - 我只需要让它在某个地方工作.
我正在从Python运行C可执行文件,这个可执行文件有时会出现段错误.当它发生段错误时,子进程模块不会在stdout或stderr中返回任何内容.
示例代码:
import subprocess
proc = subprocess.Popen(['./a.out'], stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
print 'out: "%s"' % out
print 'err: "%s"' % err
print proc.returncode
Run Code Online (Sandbox Code Playgroud)
来源a.out是:
int main() {
printf("hello world\n");
int x = 1 / 0;
}
Run Code Online (Sandbox Code Playgroud)
输出./a.out是:
hello world
Floating point exception
Run Code Online (Sandbox Code Playgroud)
Python代码的输出是(在Linux中,python 2.7):
out: ""
err: ""
-8
Run Code Online (Sandbox Code Playgroud)
有没有办法获得可执行文件的输出,即使它崩溃了?
将返回码转换为字符串消息的通用方法也很不错.
我想运行一个系统进程,拦截输出,并在Python脚本中逐行实时修改它.
我最好的尝试,等待打印前完成的过程,是:
#!/usr/bin/env python
import subprocess
cmd = "waitsome.py"
proc = subprocess.Popen(cmd, shell=True, bufsize=256, stdout=subprocess.PIPE)
for line in proc.stdout:
print ">>> " + line.rstrip()
Run Code Online (Sandbox Code Playgroud)
脚本waitsome.py只需每半秒打印一行:
#!/usr/bin/env python
import time
from sys import stdout
print "Starting"
for i in range(0,20):
time.sleep(0.5)
print "Hello, iteration", i
stdout.flush()
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的解决方案subprocess允许实时迭代输出?我必须使用线程吗?
曾几何时,我用Perl编写脚本,这是小菜一碟:
open(CMD, "waitsome.py |");
while (<CMD>) {
print ">>> $_";
}
close(CMD);
Run Code Online (Sandbox Code Playgroud) python ×7
subprocess ×5
stdout ×2
flush ×1
perl ×1
popen ×1
printing ×1
process ×1
python-3.x ×1