【问题标题】:multiprocessing problem [pyqt, py2exe]多处理问题 [pyqt, py2exe]
【发布时间】:2017-12-28 20:44:47
【问题描述】:

我正在使用 PyQt4 编写一个 GUI 程序。 我的主窗口中有一个按钮 并单击此按钮。 我希望启动一个后台进程 这是派生类的实例 来自 processing.Process.

class BackgroundTask(processing.Process):
    def __init__(self, input):
        processing.Process.__init__(self)
        ...

    def run(self):
        ...

(注意我使用的是 Python2.5 端口 获得的python-multiprocessing 从 http://code.google.com/p/python-multiprocessing/ 这就是为什么它正在处理。处理 而不是 multiprocessing.Process。 我想这不应该有所作为。 我说的对吗?)

连接到按钮点击信号的代码 就像

 processing.freezeSupport()
 task = BackgroundTask(input)
 task.start()

该程序在 python 解释器下按预期工作,即 如果它是从命令行“python myapp.py”启动的。

但是,我使用py2exe打包程序后, 每次当我点击那个按钮时, 启动后台任务,副本 的主窗口弹出。我不知道 这种行为的原因是什么。我猜 它与以下说明有关 在 http://docs.python.org/library/multiprocessing.html#multiprocessing-programming

“此包中的功能要求子级可以导入 ma​​in 方法。编程指南中对此进行了介绍,但在这里值得指出。这意味着一些示例,例如多处理.Pool 示例在交互式解释器中不起作用 "

如果 name == "ma​​in" 我只有在主模块中 就像在典型的 pyqt 程序中一样

if __name__ == "__main__":
    a = QApplication(sys.argv)
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
    w = MainWindow()
    w.show()
    a.exec_()

关于如何解决此问题的任何解决方案?谢谢!

【问题讨论】:

  • 您能否澄清一下:您是否按照多处理文档中的说明保护了主模块?还是您无权访问主模块(我不知道 pyqt 是如何工作的)?检查您使用的是最新版本的 py2exe 也是值得的。我过去遇到过问题,结果证明是由过期的 py2app/py2exe 引起的
  • 感谢您的评论。我刚刚在我的帖子中添加了 name == "main" 部分。不确定我是否在保护主模块。我从sourceforge.net/projects/py2exe/files 找到的最新版本的 py2exe 发布于 2008-11-16,所以我认为我使用的是最新版本的 py2exe。

标签: python pyqt multiprocessing py2exe


【解决方案1】:

我认为您的实际问题与此有关:

程序在 python 解释器下按预期工作,即如果它是从命令行“python myapp.py”启动的。

但是,我使用py2exe打包程序后,每次单击该按钮时,> 不是启动后台任务,而是弹出主窗口的副本。

您需要对 freeze_support() 函数添加一个特殊调用,以使多处理模块与“冻结”的可执行文件(例如,使用 py2exe 制作的可执行文件)一起工作:

if __name__ == "__main__":
    # add freeze support
    processing.freeze_support()
    a = QApplication(sys.argv)
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
    w = MainWindow()
    w.show()
    a.exec_()

参考:http://docs.python.org/library/multiprocessing.html#multiprocessing.freeze_support

【讨论】:

  • +1:前段时间遇到了完全相同的问题,使用了完全相同的修复方法。
  • 非常感谢。有用!我知道这个 freeze_support() 函数,但我没有把它放在正确的位置。我没有把它放在a = QApplication(sys.argv)之前,而是在每次创建新流程实例之前都放在它上面,这似乎不起作用。
【解决方案2】:

“此包中的功能要求主要方法可由子项导入。”

我认为这意味着您必须在某处定义 main() 函数。

【讨论】:

    【解决方案3】:

    这个问题是关于 Python 2 的,已经解决了。对于 Python 3,它看起来像:

    from multiprocessing import freeze_support
    
    if __name__ == '__main__':
        freeze_support()
    
        a = QApplication(sys.argv)
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多