Python Popen freeze/PySide GUI/cmd弹出窗口
我正在为djv_转换器创建一个简单的GUI: 它的工作很好,但我缺乏一些反馈,从这个应用程序,当我运行它与波本Python Popen freeze/PySide GUI/cmd弹出窗口,python,user-interface,cmd,pyside,Python,User Interface,Cmd,Pyside,我正在为djv_转换器创建一个简单的GUI: 它的工作很好,但我缺乏一些反馈,从这个应用程序,当我运行它与波本 args = [djv_path, newout, "%smov" % moviename,"-speed", speed ,"-scale", scale, "-save", "quicktime", "quality", quality, "-save", "quicktime", "codec", codec, "-channel", channel] child
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
问题是,任何类型的stdout都是在进程被删除之后发生的
完成了
subprocess.Popen
在缓冲区满之前不会显示标准输出。在您的情况下,缓冲区从不填充,因此在子流程完成之前不会显示任何内容
请允许我向您介绍这篇文章,并提出一些建议:
你的想法可能会有所不同,因为没有一个解决方案似乎是任何人的灵丹妙药。我个人发现,指示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()
非常感谢你的回答。我忘了补充一句,我曾尝试在stdout中刷新任何内容,但没有成功。我以前也使用过你推荐的线程,但没有一种方法有效。或者至少它们的工作方式是一样的:当外部程序终止时,我得到了输出,这对我没有好处。是否是特定的应用程序阻止了我的GUI应用程序?再次感谢:)@krzykli可能是一个愚蠢的问题,但是当你从命令行(不是从subprocess.Popen而是直接从命令行)运行你的程序时,它会将输出实时传输到终端吗?是的。它显示了每10%左右将图像序列转换为mov文件的进度。