Popen冻结/ PySide GUI / cmd弹出窗口

时间:2013-06-17 18:14:36

标签: python user-interface cmd pyside

我正在为djv_converter创建一个简单的GUI:http://djv.sourceforge.net/documentation.html 它运行正常,但是当我用Popen运行它时,我从这个应用程序中得不到一些反馈。

args =  [djv_path, newout, "%smov" % moviename,"-speed", speed ,"-scale", scale, "-save",    "quicktime",  "quality", quality, "-save", "quicktime",  "codec", codec, "-channel", channel]

child = subprocess.Popen(args,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

通常,应用程序会向控制台输出一些进度,我想用它来更新进度条。

问题是在进程完成后会发生任何类型的stdout。它看起来好像在创建子进程时冻结,然后在完成时解冻。我已经尝试了沟通 child.stdout.read ,同样的事情发生了。

我从一个从注册表调用的bat文件中运行我的python代码,所以我可以在我的右键菜单下使用它。 GUI是用PySide编写的。

我也无法停止cmd窗口的弹出窗口,无论是pythonw和.pyw文件还是修改过的.bat文件。

如果有人知道可能导致问题的原因,请告诉我:)

非常感谢, KK

1 个答案:

答案 0 :(得分:0)

  

问题是在进程发生之后会发生任何类型的标准输出   结束。

在缓冲区已满之前,

subprocess.Popen未显示STDOUT。在您的情况下,缓冲区永远不会填充,因此在子流程完成之前不会显示任何内容。

我可以通过一些建议推荐给你这个帖子: real time subprocess.Popen via stdout and PIPE

你的milage可能会有所不同,因为没有一个解决方案似乎是任何人的灵丹妙药。我个人发现,指示subprocess.Popen打开一个无缓冲的Python就可以了。

command = ["python", "-u", "python_file.py"]
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

for line in iter(p.stdout.readline, ''):
    line = line.replace('\r', '').replace('\n', '')
    print line
    sys.stdout.flush()