Skip to main content

pyinstaller 使用过程中 一些常见的坑

img

luv_more lv-1

2021年12月25日 00:36 · 阅读 113

关注

前言

写这篇文章的前言。 最近为方便后台程序,自测和别的部门测试,写了简略的自动化测试工具。 [基于python 3.9 和 pyqt6 ]

用到的模块有 json,google.protobuf, pandas 等模块。

在最终打包时候,却遇到了各种问题。去 度娘 找解决方案,本以为一个简单的问题,结果csdn上的文章千篇一律,都是 cv 大法,部分博客园上也是 cv,最终在 Stack Overflow 上找到了部分解决方法。加上自己项目本身遇到的问题,总结一下。

pyinstaller 本身使用

  • -F 参数 生成 exe 为单exe文件
  • -w 生成的exe,打开时候,会打开cmd窗口,有日志打印
  • -p 生成exe时,添加额外的路径
  • --hidden-import 添加额外的依赖模块,如python中相关模块
  • -D 生成的exe有另外一个动态库文件夹
  • -i 加exe图标

两种使用方法

  • 直接使用 pyinstaller
  • python 调用 pyinstaller
pyinstaller -F -w -p C:\... -p E:\... xxx.py --hidden-import google.protobuf.json_format --hidden-import pandas

python -m pyinstaller -F -w --name "xxx" "xxx.py" -p C:\... -p C:\...\...
复制代码

第一种使用,需要额外 --hidden-import 一些依赖 第二种使用,不用导入这些依赖

pyinstaller 打包后常见的bug

  • 打包前 打包不成功
  • 打包后,找不到模块

bug 和 解决方案

1. 打包前 可能的错误

File "E:\DevPath\python39\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1415, in add_script
with open(pathname, 'rb') as fp:
PermissionError: [Errno 13] Permission denied: 'C:\\Repository\\code\\dev\\plt\\auto_event_score_test\\logic_behaviour'
复制代码

解决方案

尝试了第一种情况加管理员权限仍然不行。 如果你的打包不幸遇到了这种情况,用第二种使用方法就能解决。

2. 打包后 可能的错误

  • BUG : no module name ‘XXX’
    • 这个module 可能是python库中的模块
    • module 也可能是自己 import 自己写的module

解决方法

  • python 中的模块。使用 --hidden-import 参数,导入需要的 module (方法1的使用才用到,方法2一般不会遇到这种情况)
  • 自己的模块 xxx 。-p [ 加上自己 import xxx 的目录 ] (如果你的项目有了很多文件夹,如果from xxx.yyy import aaa,导入-p xxx 即可。如果import 不规范,那么需要多个 -p 加上缺少模块的路径。所以说规范的重要性)

注意事项

  1. 运行打包后的exe,如果exe一闪而过,看不到错误信息,因为打包时候少了 -w 参数。加上 -w(小写)参数,就能够看到 “ no module xxx ”了,相应去解决就行了
  2. 如果使用第一种打包。有时候 no module 是exe 位置问题,看异常信息能够发现的。不过这种打包依赖别的模块(自己写的 xxx.py)

总结

简单的直接使用 pyinstaller 一般就行,使用python -m pyinstaller 保险,更简单