pyinstaller和cx_Freeze

时间:2018-07-10 16:38:01

标签: python tkinter pyinstaller python-multiprocessing cx-freeze

我用tkinter构建的GUI程序具有以下主要部分。

if __name__ == '__main__':
    root = Tk()
    my_gui = DataExtractorUI(root)
    root.mainloop()

DataExtractor在单击按钮时调用另一个函数。所述功能内部具有多重处理任务。

从命令行运行时,GUI运行良好。

当使用pyinstaller或cx_Freeze编译为exe时,该程序将继续生成1 +数量的进程,并且无法正常工作。在我的pyinstaller规范文件中:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['MainGUI.py'],
             pathex=['.'],
             binaries=[],
             datas=[('logo/m3_logo.png', 'logo')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='MainGUI',
          debug=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='MainGUI')

一开始我在命令行版本上遇到了相同的问题,通过添加if __name__ == "__main__"

解决了

使用exe打包工具,我不清楚它为什么绕过__main__入口点。

1 个答案:

答案 0 :(得分:0)

由于python多重处理会为每个产生的进程启动一个新的解释器,因此每次新进程进入if __name__ == "__main__"

时都会创建额外的窗口

对于GUI程序,可以通过在程序顶部添加以下命令来解决:

multiprocessing.freeze_support()

@codewarrior在他的回答中描述了解决原因: Why python executable opens new window instance when function by multiprocessing module is called on windows