[英]Needing Help Capturing STDOUT in real-time from pygtk GUI in python project
我正在一个项目中,我想从python pygtk GUI中使用命令行实用程序cdparanoia。 我正在使用Glade进行UI开发。 我尝试导入子流程并使用subprocess.Popen。 它可以工作,但是在执行过程时冻结了我的GUI(甚至不允许重新绘制窗口)。 对用户来说不是一个很好的交互。 我该如何防止这种行为? 我想在窗口上放置一个“取消”按钮,但这在“冻结”程序时会起作用。 最终,我想捕获stderr(如下所示,音频信息通过stdout通过管道传输到sox)并以gtk形式呈现.Expander在安装程序时具有类似于Synaptic的外观,并且用户可以看到实时发生的事情。 另外,我想使用进度指示器中的文本(如下所示)来构建实际的进度指示器小部件。 我如何获得一个shell来将信息实时传递回python,而不是一旦过程完成(当它作为一个大的信息转储将其全部提供时)?
需要捕获的实时信息:
Working on me - me - DISK 01.flac
cdparanoia III release 10.2 (September 11, 2008)
Ripping from sector 0 (track 1 [0:00.00])
to sector 325195 (track 15 [1:56.70])
outputting to stdout
(== PROGRESS == [> | 004727 00 ] == :-) O ==)
这是我到目前为止使用的代码:
quick = " -Z" if self.quick == True else ""
command = "cdparanoia -w%s 1- -| sox -t wav - \"%s - %s - DISK %s%s.flac\"" %\
(
quick,
self.book_name.replace(" ", "_"),
self.author_name.replace(" ", "_"),
"0" if disc < 10 else "",
disc
)
print command
shell = subprocess.Popen(command, shell=True, executable="/bin/bash",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
data, err = shell.communicate(command)
谢谢纳妮
我曾经写过一个Python shell实现,它确实运行wget
和具有完整功能输出的实际Python控制台。
您需要使用subprocess.Popen
并直接写入sys.stdout
:
process = subprocess.Popen(shlex.split(command), stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
complete = False
while True:
output = process.stdout.read(1)
if output == '' and process.poll() != None:
break
if output != '':
sys.stdout.write(output)
sys.stdout.flush()
是的,这里有2个问题。 首先,您需要指定读取超时,以便在子过程完成之前不会阻塞。 第二个原因是可能发生不希望发生的缓冲。
要解决第一个问题,并以异步方式从子流程中读取内容,可以尝试使用超时的subProcess模块: http ://www.pixelbeat.org/libs/subProcess.py注意,这很简单,但也很旧,并且仅适用于linux。 它被用作新的python子进程模块的基础,因此如果需要可移植性,则最好使用它。
要了解/控制可能发生的任何其他缓冲,请访问: http : //www.pixelbeat.org/programming/stdio_buffering/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.