用pyinstall打包python项目为exe文件及其问题总结

为了可以在没有安装python的环境下运行程序,我们需要将程序打包为可执行文件。这次用的pyinstall模块,操作方便(虽然前面也踩了好多坑),坑的一点就是,想要在什么平台下使用,就需要在对应的平台上进行打包。比如说这次吧,因为要在Windows系统下使用,我只能临时搭个Windows虚拟机进行打包。

安装

安装很简单,直接用pip命令

1
pip install pyinstall
打包

不管是简单还是复杂的项目,只需要对入口文件(启动整个项目的py文件)进行打包即可。

app目录下只有一个文件p.py,内容如下

1
print('test pyinstaller')

进入app根目录,打包

1
pyinstaller p.py

运行命令之后,看到以下输出就说明成功了

1
2
3
4
5
6

4583 INFO: Building EXE from EXE-00.toc completed successfully.
4585 INFO: checking COLLECT
4586 INFO: Building COLLECT because COLLECT-00.toc is non existent
4586 INFO: Building COLLECT COLLECT-00.toc
5412 INFO: Building COLLECT COLLECT-00.toc completed successfully.

这时候app目录下多了两个文件夹和spec文件,其中spec文件是最先生成的,pyinstaller再根据这个文件进行打包。所以对于比较复杂的项目,可以先生成spec,修改里面对应的配置,比如添加其他需要的多媒体文件等

双击dist下的p可执行文件就可以正常运行程序了

在打包程序的时候可以指定参数onefile,这样打包出来的dist下就只有一个可执行文件,不过运行速度可能会稍微慢一点

1
pyinstaller --onefile p.py

运行可执行文件时会出现终端窗口,如果不希望看到,可以使用w参数

1
pyinstall --onefile -w p.py

其他更详细的使用和配置,查看官方文档

可能遇到的问题
  1. OSError: Python library not found: Python, libpython3.5m.dylib, libpython3.5.dylib, .Python

    我是在pyenv创建的环境下安装使用pyinstall模块的,之所以会出现这个问题是因为python在安装pyenv时没有执行--enabled-shared。重新安装即可

    1
    2
    3
    4
    5
    6
    7
    8
    # 检查
    echo ${PYENV_ROOT}/versions/3.5.3/Python.framework

    # 更新
    env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.5.0

    # 重新打包
    pyinstaller --onefile p.py
  2. AttributeError: ‘str’ object has no attribute ‘items’

    关了pycharm编辑器就不报错了。。。

  3. windows下路径问题

    因为项目是在unix下开发的,测试时在Windows下进行的,当时也没报错,就是找不到运行之后保存的数据文件。后面想了想,可能还是路径的问题。所以将代码需要用到的路径的代码都改了成类似E:/data这样的路径。果然就可以了。需要注意的是,Windows下的路径一般是E:\data,但是\是转义符,所以要么写成上面那样,要么进行反转义,比如:E:\\data

参考

using spec files

pyenv issue

Python 3.5 - missing libpython3.5m.so (shared library)