为了可以在没有安装python的环境下运行程序,我们需要将程序打包为可执行文件。这次用的pyinstall模块,操作方便(虽然前面也踩了好多坑),坑的一点就是,想要在什么平台下使用,就需要在对应的平台上进行打包。比如说这次吧,因为要在Windows系统下使用,我只能临时搭个Windows虚拟机进行打包。
安装
安装很简单,直接用pip命令
1 | pip install pyinstall |
打包
不管是简单还是复杂的项目,只需要对入口文件(启动整个项目的py文件)进行打包即可。
app目录下只有一个文件p.py,内容如下
1 | print('test pyinstaller') |
进入app根目录,打包
1 | pyinstaller p.py |
运行命令之后,看到以下输出就说明成功了
1 | … |
这时候app目录下多了两个文件夹和spec文件,其中spec文件是最先生成的,pyinstaller再根据这个文件进行打包。所以对于比较复杂的项目,可以先生成spec,修改里面对应的配置,比如添加其他需要的多媒体文件等

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


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

运行可执行文件时会出现终端窗口,如果不希望看到,可以使用w参数
1 | pyinstall --onefile -w p.py |
其他更详细的使用和配置,查看官方文档
可能遇到的问题
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.pyAttributeError: ‘str’ object has no attribute ‘items’
关了pycharm编辑器就不报错了。。。
windows下路径问题
因为项目是在unix下开发的,测试时在Windows下进行的,当时也没报错,就是找不到运行之后保存的数据文件。后面想了想,可能还是路径的问题。所以将代码需要用到的路径的代码都改了成类似
E:/data
这样的路径。果然就可以了。需要注意的是,Windows下的路径一般是E:\data
,但是\
是转义符,所以要么写成上面那样,要么进行反转义,比如:E:\\data