【问题标题】:Popen freeze / PySide GUI / cmd popupPopen freeze / PySide GUI / cmd popup
【发布时间】:2013-06-18 02:22:08
【问题描述】:

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

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

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

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

cmd窗口的弹出我也停不下来,不管是pythonw和.pyw文件还是修改过的.bat文件。

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

非常感谢, KK

【问题讨论】:

    标签: python user-interface cmd pyside


    【解决方案1】:

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

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

    我是否可以向您指出该线程并提供一些建议: real time subprocess.Popen via stdout and 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()
    

    【讨论】:

    • 非常感谢您的回答。我忘了补充一点,我已经尝试在标准输出中刷新任何内容但没有成功。我之前也浏览过您推荐的线程,但这些方法都不起作用。或者至少它们的工作方式相同:当外部程序终止时,我得到了我的输出,这对我没有好处。会不会是阻止我的 GUI 应用程序的特定应用程序?再次,非常感谢:)
    • @krzykli 可能是一个愚蠢的问题,但是当您从命令行(不是从 subprocess.Popen 而是直接从命令行)运行程序时,它是否会通过管道将输出实时传输到终端?时间?
    • 是的。它显示每 10% 左右将图像序列转换为 mov 文件的进度。
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 2014-04-24
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多