【发布时间】: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
“此包中的功能要求子级可以导入 main 方法。编程指南中对此进行了介绍,但在这里值得指出。这意味着一些示例,例如多处理.Pool 示例在交互式解释器中不起作用 "
如果 name == "main" 我只有在主模块中 就像在典型的 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