0

我正在为 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)

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

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

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

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

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

非常感谢,KK

4

1 回答 1

0

问题是任何类型的标准输出都会在该过程完成后发生。

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

我是否可以通过一些建议向您指出该线程: 实时 subprocess.Popen via stdout 和 PIPE

您的里程可能会有所不同,因为任何解决方案似乎都不是任何人的灵丹妙药。我个人发现,指示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()
于 2013-06-17T18:22:08.543 回答