相关疑难解决方法(0)

多处理问题[pyqt,py2exe]

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

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

    def run(self):
        ...
Run Code Online (Sandbox Code Playgroud)

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

连接到按钮点击信号的代码简直就是这样

 processing.freezeSupport()
 task = BackgroundTask(input)
 task.start()
Run Code Online (Sandbox Code Playgroud)

该程序在python intepreter下按预期工作,即它是从命令行"python myapp.py"启动的.

但是,在我使用py2exe打包程序后,每次单击该按钮时,都会弹出主窗口的副本,而不是启动后台任务.我不确定这种行为的原因是什么.我想这与http://docs.python.org/library/multiprocessing.html#multiprocessing-programming中提到的以下注释有关.

"这个包中的功能要求主要方法可由子进程导入.这在编程指南中有所涉及,但值得指出这一点.这意味着一些例子,例如multiprocessing.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_()
Run Code Online (Sandbox Code Playgroud)

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

python pyqt py2exe multiprocessing

16
推荐指数
1
解决办法
6131
查看次数

jupyter笔记本中的多处理.Pool适用于Linux而不适用于windows

我正在尝试运行一些独立的计算(尽管从相同的数据中读取).我的代码在Ubuntu上运行时有效,但在Windows(Windows Server 2012 R2)上没有,我得到错误:

'module' object has no attribute ...

当我尝试使用时multiprocessing.Pool(它出现在内核控制台中,而不是笔记本本身的输出)

(而且我已经犯了在创建池后定义函数的错误,我也纠正了它,这不是问题).

甚至在最简单的例子中也会发生这种情况:

from multiprocessing import Pool
def f(x):
    return x**2
pool = Pool(4)
for res in pool.map(f,range(20)):
    print res
Run Code Online (Sandbox Code Playgroud)

我知道它需要能够导入模块(我不知道在笔记本中工作时它是如何工作的),我听说过IPython.Parallel,但我一直无法找到任何文档或示例.

任何解决方案/替代品都是最受欢迎的.

python python-2.7 python-multiprocessing jupyter

16
推荐指数
1
解决办法
2万
查看次数

当作为可执行文件冻结时,多处理运行主窗口的新实例

一年前我已经问过这个问题.我的应用程序使用Python的多处理模块,从命令行运行时工作正常,但是当我使用Pyinstaller将其打包为可执行文件时,多个进程会生成为原始的新实例,而不是运行它们应该运行的函数.上次给我的建议以及我看到的其他地方的建议是multiprocessing.freeze_support(在我的if __name__ == "__main__":块开始时打电话,我一直这样做,但是由于某种原因我突然再次遇到这个问题.还有什么可能导致这个?

更新:我已确认freeze_support()行的存在根本不会影响此问题.对它进行注释或取消注释它会产生完全相同的行为:主窗口的副本被打开并坐在那里什么都不做.这是在我的主要Python模块的最末端调用它的块:

if __name__ == '__main__':
    freeze_support()

    # (A bunch of commented-out lines)
    main()
Run Code Online (Sandbox Code Playgroud)

python pyinstaller multiprocessing

5
推荐指数
1
解决办法
1792
查看次数