当前位置:   article > 正文

PyInstaller使用以及部分注意_--hidden-import

--hidden-import

一、pyInstaller使用简介

Python程序打包成独立的.exe执行文件可以使用PyInstaller。打包对象包含依赖库、图像等资源文件,可以在没有安装python环境的电脑上运行(目前测试,只在win10系统上有效,win7以下系统会有报错提示)。

PyInstaller使用可以组合多种配置参数,用于打包和生成exe文件。

以下是网上找到的一些常用参数使用以及说明https://blog.csdn.net/zqzgng/article/details/134874366

  • -F 或 --onefile:生成单个可执行文件
  • -D 或 --onedir:生成一个目录,包含可执行文件和依赖文件
  • -n 或 --name:指定生成的可执行文件或目录的名称
  • -w 或 --windowed:生成无控制台窗口的可执行文件(即 GUI 应用)
  • -c 或 --console:生成控制台窗口的可执行文件(即命令行应用)
  • --icon:指定应用程序图标文件的位置
  • --hidden-import:指定需要手动添加的 Python 模块(如果 Pyinstaller 未正确解析引用)
  • --additional-hooks-dir:指定一个目录,Pyinstaller 会在此目录中寻找自定义的 hook 文件,以添加额外的模块

命令行的使用实例如下:

pyinstaller -F -w -i my_icon.ico --name=test_app test_script.py

上述命令的作用是将test_script.py程序打包成没有控制台窗口(-w)的单个可执行文件(-F),指定其应用程序图标文件my_icon.ico(-i my_icon.ico),生成文件名为test_app(若不指定文件名,默认和.py文件同名)。

这里需要注意的是,-w参数的使用,当打包程序运行存在问题时,没有使用-w参数,错误提示会在控制台窗口显示,但是会闪退,使用-w之后会通过消息弹窗的方式提示。

二、PyInstaller使用过程出现的问题

1、在pycharm中运行没有问题,但打包出来却提示某模块找不到:

ModuleNotFoundError: No module named 'PyQt5.sip'

出现上述情况有一下几种情况:

(1)首先使用--hidden-import命令;

根据命令说明,可用作手动添加python模块,对于pyinstaller未正确解析应用的情况下使用;

我首先尝试该命令,但是没有用依然提示找不到模块;

(2)使用--additional-hooks-dir命令,俗称使用钩子脚本,即通过该脚本高速PyInstaller如何处理脚本中库文件;流程如下

        a、创建钩子脚本

首先,需要创建一个钩子脚本,告诉 PyInstaller 如何处理 PyQt5 库。在项目的根目录下创建一个名为 pyqt5_hooks.py 的文件,并将以下内容添加进去,假设这里是pyqt5的库有问题:

        

  1. from PyInstaller.utils.hooks import collect_all
  2. datas, binaries, hiddenimports = collect_all('PyQt5')

        b、使用--additional-hooks-dir选项命令

在使用 PyInstaller 打包程序时,使用 --additional-hooks-dir 选项来指定包含钩子脚本的目录。假设你的钩子脚本存放在项目的 hooks 目录下,你可以这样使用 PyInstaller:

pyinstaller --additional-hooks-dir=hooks WatchdogProgram.py

这将告诉 PyInstaller 在打包过程中使用 hooks 目录中的钩子脚本。

执行上述命令后,PyInstaller将使用指定的钩子脚本处理PyQt5,并将其打包到可执行文件中。

多个库使用时只需在a步骤中将对应库的信息融合到一起就行,如还需要增加psutil库的使用:

  1. from PyInstaller.utils.hooks import collect_all
  2. # 处理 PyQt5 库
  3. datas, binaries, hiddenimports = collect_all('PyQt5')
  4. # 处理 psutil 库
  5. datas_psutil, binaries_psutil, hiddenimports_psutil = collect_all('psutil')
  6. # 合并结果
  7. datas.extend(datas_psutil)
  8. binaries.extend(binaries_psutil)
  9. hiddenimports.extend(hiddenimports_psutil)

需要注意的是,该方法会使打包的exe文件非常大,需要慎重使用;

我在这里使用之后依然没有解决问题,经过仔细对比后发现问题如下;

(3)pycharm IDE的运行解释器版本和终端使用pyinstaller的python解释器版本不一样;

        比如我这里命令行python环境时3.7.9,但使用pyinstaller时python版本为3.10.5(也是没有合理使用虚拟环境的恶果,具体原因现在不想去深究了);

        解决办法就是将python解释器的版本切换成对应版本,反正使用PyInstaller要和Python配套;我这里是将解释器python换成3.10的,同时将对应使用的软件包进行下载;

然后重新使用上面的打包指令即可;

这里也需要注意,部分模块之间版本的依赖关系,我看网上提示PyQt5和PyQt5-sip版本不配套有可能会导致该问题,装来装去都不对,干脆将设计PyQt5的模块都卸载后,重新安装默认版本后,问题解决;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/867584
推荐阅读
相关标签
  

闽ICP备14008679号