pyinstaller系列之七:打包各种问题汇总

本文详细列举了使用PyInstaller进行Python程序打包时遇到的问题,包括32/64位兼容、RecursionError、编码错误、多进程、PyQt5闪退、缺失依赖、隐藏导入模块找不到、文件路径问题、QThread错误、Scikit-learn模块找不到等,并提供了相应的解决方法和参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用pyinstaller打包的整个过程中,遇到不少问题,在此总结一下。后面遇到会继续更新!

1. 在64下可运行,不能在32位下运行
   解决:在32位系统下打包,可以参考 https://blog.youkuaiyun.com/u012219045/article/details/115320619

2. RecursionError:maximum recursion depth
   解决:在xxx.spec文件开始增加两行:

    import sys
    sys.setrecursionlimit(5000)

再执行打包:pyinstaller xxx.spec 

3. UnicodeDecodeError:'utf-8' codec can't decode byte 0xce in position 122:invalid continuation byte
   解决:在你打包的命令行中先输入chcp 65001 然后再输入打包命令。

4. 使用了多进程 multiprocessing 模块
   解决:必须调用 multiprocessing.freeze_support(),直接在“if __name__ == '__main__'”之后调用

5. 打包PyQt5闪退
   原因:可能未找到某个文件
   解决办法:
        1. 把需要读取的文件及其其他资源 都放到dist中。
        2. 打包成exe的话,需使用 --add-data 附加。可参考:https://blog.youkuaiyun.com/u012219045/article/details/114841287

6. WARNING:file already exists but should not:_C.cp37-win_amd64
   解决:报错内容可能不同,但都是xxx已存在,问题的原因是pyinstaller打包时多打了一次,所以会报已经存在了。
   这个解决方案就是把多余的去掉。在自动生成的xxx.spec中,在 a 和 PYZ 中间添加如下代码,去掉多余依赖项

    for d in a.datas:
        if '_C.cp37-win_amd64' in d[0]:
            a.datas.remove(d)
            break

7. Hidden import "xxx"  not found!
    Hidden import "pkg_resources.markers" not found!
    Hidden import "pkg_resources.py2_warn" not found!
    Hidden import "MySQLdb" not found!
    Hidden import "sqlalchemy.sql.functions.func" not found!
    Hidden import "mx.DateTime" not found!
    解决: hiddenimports=['pkg_resources.markers', 'pkg_resources.py2_warn', '...']

8.  打包的时候出现了很多warning:lib not found...dll, 原因是pyinstaller 没有办法识别到这些dll
    解决办法:copy warning中一些dll文件的名字,再电脑中搜索到他们的路径!添加到环境变量里面
    WARNING:lib not found:msmpi.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_blacs_msmpi_ilp64.dll
    WARNING:lib not found:impi.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_blacs_intelmpi_lp64.dll
    WARNING:lib not found:msmpi.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_blacs_msmpi_lp64.dll
    WARNING:lib not found:impi.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_blacs_intelmpi_ilp64.dll
    WARNING:lib not found:mpich2mpi.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_blacs_mpich2_lp64.dll
    WARNING:lib not found:mpich2mpi.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_blacs_mpich2_ilp64.dll
    WARNING:lib not found:pgf90.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_pgi_thread.dll
    WARNING:lib not found:pgf90rtl.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_pgi_thread.dll
    WARNING:lib not found:pgc14.dll dependency of d:\programdata\anaconda3\Library\bin\mkl_pgi_thread.dll
    WARNING:lib not found:torch_python.dll dependency of d:\programdata\anaconda3\lib\site-packages\torch\_C.cp37-win_amd64.pyd

9. 切换了虚拟环境打包,报DLL无法导入,实际是打包时还在使用旧的虚拟环境
    解决: 打包时指定虚拟环境:-p。可参考: https://blog.youkuaiyun.com/u012219045/article/details/113612475

10. DecodeEncodeError
    解决: 检查执行路径中是否有中文,非Acsii码,换成英文路径。Python文件开头加 #-*-coding:utf-8-*-

11. Pyqt5 打包后会出现错误:"QThread:Destroyed while thread is still running"
    解决办法1:启动QThread使用了start(), 改为run() 可解决,但这样会卡主UI线程
    解决办法2:依然使用start(),再追加一句 exec()。推荐这样!

12. No module named 'sklearn.xx'
    43852 WARNING: Hidden import "sklearn.utils.sparsetools._graph_validation" not found!
    43854 WARNING: Hidden import "sklearn.utils.sparsetools._graph_tools" not found!
    43866 WARNING: Hidden import "sklearn.utils.lgamma" not found!
    No module named 'sklearn.utils._cython_blas'
    No module named 'sklearn.neighbors._typedefs'
    No module named 'sklearn.neighbors._quad_tree'
    No module named 'sklearn.tree'
    No module named 'sklearn.tree._utils'
    解决:hiddenimports=['sklearn', 'sklearn.tree', 'sklearn.tree._utils', 'sklearn.neighbors._quad_tree',
                       'sklearn.neighbors._typedefs', 'sklearn.utils._cython_blas',
                       'sklearn.utils.sparsetools._graph_validation',
                       'sklearn.utils.sparsetools._graph_tools', 'sklearn.utils.lgamma']
13. No module named 'scipy.special.cython_special'
   解决: 使用scipy==1.4.1 或者 --hidden-import scipy.special.cython_special

14. No such file or directory: 'xxx\\librosa\\util\\example_data\\registry.txt'
   解决: 使用--add-data或者直接拷贝librosa下的对应文件到dist。
   
15. fatal error:zmq.h:No such file or directory
    解决: sudo apt install libzmq3-dev

16. Error loading "xxx\torch\lib\caffe2_detectron_ops_gpu.dll" or one of its dependencies
    开始使用pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.1,后来更换高版本torch1.7.0解决!
    # pip install torch===1.7.0+cu110 torchvision===0.8.1+cu110 torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

17. pkg_resources.DistributionNotFound: The 'cryptography' distribution was not found and is required by the application

      解决:类似这种的是缺少库,直接安装 pip install cryptography。

18. No such file or directory: '..\\xpinyin\\Mandarin.dat'

解决:   进入对应环境里的xpinyin库里,把 xpinyin\Mandarin.dat 拷贝到dist,或者.spec文件里添加: --add-data="xxx\xpinyin\*.*;.\xpinyin"

19. PyQt5.12.1 QtWebEngineWidgets must be imported before a QCoreApplication instance is created

解决:from PyQt5.QtWebEngineWidgets import * 写在运行主脚本的导入qt库的最前面!,以下是启动主脚本 client.py:

要将多个Python代码打包成exe可执行文件,可以使用pyinstaller工具。PyInstaller是一个用于将Python应用程序打包成独立可执行文件的工具。它可以将Python代码和所有依赖项打包成一个单独的可执行文件,使得在没有Python环境的计算机上也能运行。 以下是使用PyInstaller打包多个Python代码的步骤: 1. 安装PyInstaller:使用pip命令安装PyInstaller库。在命令行中运行以下命令:pip install pyinstaller 2. 创建打包脚本:创建一个文本文件,命名为packaging_script.spec,用于指定打包的配置和选项。在该文件中,可以指定要打包的Python代码文件、依赖项和其他选项。 3. 编辑打包脚本:在packaging_script.spec文件中,使用以下代码指定要打包的Python代码文件: ``` a = Analysis(\['script1.py', 'script2.py'\], ...) ``` 4. 执行打包命令:在命令行中,使用以下命令执行打包操作: ``` pyinstaller packaging_script.spec ``` 5. 等待打包完成:PyInstaller将会自动将Python代码和依赖项打包成一个可执行文件。等待打包过程完成。 6. 查找可执行文件:打包完成后,在生成的dist文件夹中可以找到生成的可执行文件。 通过以上步骤,你可以将多个Python代码打包成一个exe可执行文件,方便在没有Python环境的计算机上运行。请注意,打包过程中可能会遇到一些依赖项的问题,你可能需要手动解决这些问题,以确保打包成功。 \[2\] \[3\] #### 引用[.reference_title] - *1* [Python打包exe可执行文件(全)](https://blog.youkuaiyun.com/qq_55957975/article/details/121474022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Python打包exe文件方法汇总](https://blog.youkuaiyun.com/weixin_43931979/article/details/130569418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值