为什么 python 可执行文件在 windows 上调用多处理模块的函数时打开新的 window 实例
Why python executable opens new window instance when function by multiprocessing module is called on windows
简短问题:为什么 python pyinstaller 生成的可执行文件在 windows 操作系统
上调用多处理模块的函数时打开新的 window 实例
我有一个使用 pyside 编写的 GUI 代码。当我们点击简单按钮时,它将在另一个进程中计算阶乘(使用多处理模块)。
当我 运行 python 程序时,它按预期工作。但是在我使用 PyInstaller 创建可执行文件之后,当我 运行 使用 exe 时,它正在创建新的 window 当调用 multiprocessing 模块的函数时。这是重现问题的代码和分步过程。
代码:
import sys
import multiprocessing
from PySide import QtGui
from PySide import QtCore
def factorial():
f = 4
r = 1
for i in reversed(range(1, f+1)):
r *= i
print 'factorial', r
class MainGui(QtGui.QWidget):
def __init__(self):
super(MainGui, self).__init__()
self.initGui()
def initGui(self):
b = QtGui.QPushButton('click', self)
b.move(30, 30)
b.clicked.connect(self.onClick)
self.resize(600, 400)
self.show()
def onClick(self):
print 'button clicked'
self.forkProcess()
def forkProcess(self):
p = multiprocessing.Process(target=factorial)
p.daemon = True
p.start()
if __name__ == "__main__":
print 'ok'
app = QtGui.QApplication(sys.argv)
ex = MainGui()
sys.exit(app.exec_())
运行 以上代码使用 windows 命令提示符或电源 shell
pyinstaller.exegui.py
打开dist/gui/gui.exe (dist\gui\gui.exe)。您将有一个 window opens
当我们点击按钮 click 时,它正在计算阶乘,但会创建一个新的 window 实例。有点奇怪。当我在创建可执行文件之前或在 linux 上执行程序时,它不会发生。只有当我执行生成的 python 可执行文件
时才会发生
点击点击按钮后的截图
如果您想将多处理用作冻结的可执行文件,您需要在主脚本的开头调用 multiprocessing.freeze_support()
。这将允许多处理 "take over" 当它产生它的工作进程时。
另见 https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing
简短问题:为什么 python pyinstaller 生成的可执行文件在 windows 操作系统
上调用多处理模块的函数时打开新的 window 实例我有一个使用 pyside 编写的 GUI 代码。当我们点击简单按钮时,它将在另一个进程中计算阶乘(使用多处理模块)。 当我 运行 python 程序时,它按预期工作。但是在我使用 PyInstaller 创建可执行文件之后,当我 运行 使用 exe 时,它正在创建新的 window 当调用 multiprocessing 模块的函数时。这是重现问题的代码和分步过程。
代码:
import sys
import multiprocessing
from PySide import QtGui
from PySide import QtCore
def factorial():
f = 4
r = 1
for i in reversed(range(1, f+1)):
r *= i
print 'factorial', r
class MainGui(QtGui.QWidget):
def __init__(self):
super(MainGui, self).__init__()
self.initGui()
def initGui(self):
b = QtGui.QPushButton('click', self)
b.move(30, 30)
b.clicked.connect(self.onClick)
self.resize(600, 400)
self.show()
def onClick(self):
print 'button clicked'
self.forkProcess()
def forkProcess(self):
p = multiprocessing.Process(target=factorial)
p.daemon = True
p.start()
if __name__ == "__main__":
print 'ok'
app = QtGui.QApplication(sys.argv)
ex = MainGui()
sys.exit(app.exec_())
运行 以上代码使用 windows 命令提示符或电源 shell
pyinstaller.exegui.py
打开dist/gui/gui.exe (dist\gui\gui.exe)。您将有一个 window opens
当我们点击按钮 click 时,它正在计算阶乘,但会创建一个新的 window 实例。有点奇怪。当我在创建可执行文件之前或在 linux 上执行程序时,它不会发生。只有当我执行生成的 python 可执行文件
时才会发生点击点击按钮后的截图
如果您想将多处理用作冻结的可执行文件,您需要在主脚本的开头调用 multiprocessing.freeze_support()
。这将允许多处理 "take over" 当它产生它的工作进程时。
另见 https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing