Loading... 最近在使用Pyinstaller打包Python程序的时候发现,打包过程正常,但在运行时会出错,表现为进程不断增加至占满电脑CPU死机,程序版本及环境为: Windows 10 Python3.6 Pyinstaller 3.4 经过网上的多番搜索查阅发现是因为程序使用了多进程模式,而在windows上Pyinstaller打包多进程程序需要添加特殊指令。 这里是官方github给出的解释: https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing 修改方式比较简单,在` if __name__=='__main__:`下添加一句`multiprocessing.freeze_support() `即可。 如下: ```python if __name__=='__main__': # 在此处添加 multiprocessing.freeze_support() # 这里是你的代码 # ...... ``` 如果你的Pyinstaller版本低于3.3版本的话,还需要额外添加一个模块: ```python import os import sys # Module multiprocessing is organized differently in Python 3.4+ try: # Python 3.4+ if sys.platform.startswith('win'): import multiprocessing.popen_spawn_win32 as forking else: import multiprocessing.popen_fork as forking except ImportError: import multiprocessing.forking as forking if sys.platform.startswith('win'): # First define a modified version of Popen. class _Popen(forking.Popen): def __init__(self, *args, **kw): if hasattr(sys, 'frozen'): # We have to set original _MEIPASS2 value from sys._MEIPASS # to get --onefile mode working. os.putenv('_MEIPASS2', sys._MEIPASS) try: super(_Popen, self).__init__(*args, **kw) finally: if hasattr(sys, 'frozen'): # On some platforms (e.g. AIX) 'os.unsetenv()' is not # available. In those cases we cannot delete the variable # but only set it to the empty string. The bootloader # can handle this case. if hasattr(os, 'unsetenv'): os.unsetenv('_MEIPASS2') else: os.putenv('_MEIPASS2', '') # Second override 'Popen' class with our modified version. forking.Popen = _Popen ``` 把上述内容保存为`multiprocess.py` ,然后在你的程序中引入该模块即可: ```python from multiprocess import * ``` 值得提醒一点的是,上述程序打包时提示的错误非常难以定位到多进程处的问题,而是会提示一些别的包或者依赖文件找不到等等。 另外有关Pyinstaller打包常出现的问题可以在其他文章中找到一些解决方案: Pyinstaller基本用法:https://blog.csdn.net/zyc121561/article/details/79563662 Pyinstaller隐式导入出错解决:https://blog.csdn.net/zyc121561/article/details/79562935 最后修改:2024 年 12 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏