“谁闻鸡起舞”

  • 0. exe打包完整流程
  • 1. 打简单的单文件
  • 1.1 生成文件夹
  • 1.2 生成多文件
  • 2.路径问题
  • 3. 模块依赖问题(手动指定打包)
  • 3.1 解决方法
  • 4. 细节问题
  • 4.1 exe显示/不显示报错信息


pye2e和pyinstaller均支持.py文件到.exe文件的打包。这里主要介绍pyinstaller,没有为什么。
安装:

pip install pyinstaller
  • 支持MAC,win

0. exe打包完整流程

完整流程应该是一个项目对应一个虚拟环境,还有依赖。

  1. 创建虚拟环境
  2. 完成本地开发
  3. 导出依赖
    pip freeze > requirements.txt
  4. 到新环境安装依赖
    pip install -r requirements.txt
  5. 用pyinstaller打包
    具体打包见下文

1. 打简单的单文件

如果要自定义应用程序名加参数-n 文件名即可

1.1 生成文件夹

含exe,执行:

pyinstaller -D hello.py -n hello

最终同helllo.py目录下生成:

/build文件夹:编译中间文件
/dist文件夹:打包结果,可以压缩dist然后发给别人
/hello.spec:打包过程中的配置文件

1.2 生成多文件

只有exe文件

pyinstaller -F hello.py -n hello

输出只有一个/dist/下的一个exe文件。
说明:这个程序在执行的时候,会自动解压很多需要的文件和依赖,会在系统的一个临时路径下执行。因此如果有用到其他文件或者读取其他文件的话请:参考

2.路径问题

打包项目中需要用到其他文件,请参考

3. 模块依赖问题(手动指定打包)

模块依赖有如下几种情况:

  1. exec.py 依赖A.py
  2. exec.py 依赖A.py A.py依赖B.py
    这两种情况都是可以自动解决的。
    这种情况不会自动导入包:
    动态导入包的情况例如使用了importlib,就不会自动导包,所以要手动指定需要打包的文件。

3.1 解决方法

此时我们就用到了上一步生成的hello.spec文件(即使它报错了),找到这一行hiddenimports=[],在这里手动加入需要打包的文件(data/a.py)

hiddenimports = [
	"data.a"
]

然后打包命令也要相应改变,如下:

pyinstaller -F hello.spec

4. 细节问题

4.1 exe显示/不显示报错信息

  1. 双击程序,如果有错直接闪退
  2. 在终端执行,如果有错会有报错信息