分享

Pyinstaller 详解多种打包过程(去坑,填坑)。...

 行走在理想边缘 2022-05-25 发布于四川

前言

本篇文章,详细介绍pyinstaller多种打包过程。去坑,填坑。




一、安装Pyinstaller 

1)使用下面的命令即可安装(win10)

pip install pyinstaller



二、使用参数

1采用命令行的方式

       1)参数介绍

选项参数   参数解释
-hhelp(帮助信息)

-v

 version(版本号)
-c显示命令行窗口
-w不显示命令行窗口

-F(大写)

生成结果是一个exe程序,所有依赖项被打包进该exe程序中
-D(大写)生成结果是一个包含exe程序的目录,所有依赖项和exe程序位于同一目录下
-i为生成的exe程序指定一个icon格式的图标
-nname(指定生成的.exe和.spec文件名)
–distpath指定打包后的程序存放目录,默认存放在当前目录下的(新建的)dist目录
–workpath为输出的所有临时文件指定存放目录

       2) 使用示例

            在调试过程中不推荐加-w参数这样程序可能一闪而过,不能确定是执行完毕还是bug终止。

pyinstaller -F -w setup.py 

2采用编写.spec脚本方式。

        1)生成.spec方式

 pyi-makespec -F -w setup.py

或者

pyinstaller -F -w setup.py 

也会生成.spec,不过推荐将生成的build文件夹和dist文件夹删掉。

        2).spec脚本参数介绍

  1. # -*- mode: python ; coding: utf-8 -*-


  2. block_cipher = None


  3. a = Analysis(['setup.py'
  4. ],
  5. pathex=[],
  6. binaries=[],
  7. datas=[('lab','lab')],
  8. hiddenimports=[],
  9. hookspath=[],
  10. hooksconfig={},
  11. runtime_hooks=[],
  12. excludes=[],
  13. win_no_prefer_redirects=False,
  14. win_private_assemblies=False,
  15. cipher=block_cipher,
  16. noarchive=False)
  17. pyz = PYZ(a.pure, a.zipped_data,
  18. cipher=block_cipher)

  19. exe = EXE(pyz,
  20. a.scripts,
  21. [],
  22. exclude_binaries=True,
  23. name='setup',
  24. debug=False,
  25. bootloader_ignore_signals=False,
  26. strip=False,
  27. upx=True,
  28. console=True,
  29. disable_windowed_traceback=False,
  30. target_arch=None,
  31. codesign_identity=None,
  32. entitlements_file=None )
  33. coll = COLLECT(exe,
  34. a.binaries,
  35. a.zipfiles,
  36. a.datas,
  37. strip=False,
  38. upx=True,
  39. upx_exclude=[],
  40. name='setup')

生成的脚本就是这样的,包含以下主要配置参数

参数含义
aAnalysis类的实例,主要分析.py文件的依赖项,如第三方库以及import模块。a中内容主要包括以下四部分:scripts,放入.py文件。;pure,程序代码文件中的纯Python模块,包括程序的代码文件本身;binaries,需要的二进制文件。;datas,非二进制文件。
pyzPYZ的实例,是一个.pyz文件,包含了所有pure中的所有Python模块。
exeEXE类的实例,处理Analysis和PYZ的结果的,用来生成最后的exe可执行程序。
collCOLLECT类的实例,用于创建输出目录。只有-D命令下才会实例化,-F不会生成目录。
block_cipher加密密钥(一般无加密需求,可不设置)

而我们一般在配置时大多数情况下只涉及a,也就是Analysis类,下面逐一分析a里面的参数

Analysis的参数简介以及可能存在的问题
scripts

首先是一个列表(list),应该存放与打包文件相关的所有.py文件。如果不存放的话会出现import错误 no module 的问题。

pathex

默认有一个spec的目录,记得把用到的模块的路径添加到这个list变量里。

默认的路径是你打包的.py文件的同级路径。

存在问题:当引入自己的文件时添加此路径并不起作用。仍会报错

ModuleNotFoundError: No module named 'core'
datas将资源文件或文件夹,复制到打包后的目录中,而datas中必须以元组形式否则会出现下面错误。注意一点放到这里面的文件不会被编译,而是复制,所以重要的文件放到这里很容易泄露。
ValueError: too many values to unpack (expected 2)
binaries   添加二进制文件,也是一个列表,定义方式与datas参数一样。
hiddenimports隐式导入的模块,比如在__import__、imp.find_module()、exec、eval等语句中导入的模块,这些模块PyInstaller是找不到的,需要手动指定导入,
hookspath指定额外hook文件(可以是py文件)的查找路径。
runtime_hooks 指定自定义的运行时hook文件路径(可以是py文件)
excludes 指定可以被忽略的可选的模块或包。


三、可能遇到的问题以及解决办法。

1)打包过程找不到自己自建模块如

ModuleNotFoundError: No module named 'core'

可以将模块添加到datas里注意复制后的名字('core','core')最好是原名(个人经验)。

还可以将自己的模块直接复制到site-packages 下面,再打包。

2)打包成功却不能正确执行,进程无法阻塞,.exe一直在循环。

这是因为在调用某些模块的时候,也是进程,而在多进程中,你程序中的进程不会被阻塞,而一直循环起进程。用下面方法去解决,注意下面代码要放在代码最开始在import 模块之前。

  1. from multiprocessing import freeze_support
  2. freeze_support()

四、总结

这篇文章会解决常见的pyinstaller 打包问题,文章中错误的地方欢迎小伙伴指出。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多