python UI应用程序在使用for循环中的subprocess.Popen将stdout输出更新到UI时挂起

时间:2016-09-19 07:21:18

标签: python multithreading loops subprocess pyqt4

我正在运行subprocess.Popen()来调用命令行工具,它将输出打印到控制台,如下所示:

[app] : Initializing...
[app] : Starting process
[app] : .............
[app] : .............
[app] : Extracting information
[app] : Downloading information
[app] : 100% completed              
[app] : Saving file to disk
[app] : Completed

现在我正在尝试捕获输出,以便我可以实时向我的python UI应用程序显示此输出。我正在捕捉输出:

cmd = "..."
p = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
for line in p.stdout:
    self.status.showmsg(str(line.rstrip()))
    p.stdout.flush()

问题:输出正确地显示在我的UI上,直到它到达输出行,显示完成的过程百分比(示例中为100%)。这是UI挂起并且%的逐渐增加未显示或此后的任何输出。该程序在后台运行正常(确实如此),当它100%完成时,UI解冻。

我在这里做错了什么?在我看来(%)输出也是另一个循环而失败但我不知道为什么或如何在python中处理它。

感谢宝贵的建议!

1 个答案:

答案 0 :(得分:1)

在单独的线程中运行工作进程,并使用自定义信号将数据发送回gui。这是一个非常基本的演示脚本:

SET @line = ST_GeomFromText('LINESTRING(44.9894318 37.496227, 44.9901579 37.4964403)',4326); SET @pt = ST_GeomFromText('POINT(45.00 37.4964)',4326); SET @buffer=st_buffer(@line,0.0124274); SELECT ST_WITHIN(@pt,@buffer)