在前面的一章里,我们学习到了两种方法把python打包成EXE文件。但是这两种方式都是使用的Cpython作为解析器。导致其运行效率不是很高。而且这两种方法打包出来的软件还是挺大的。而pypy是无法用pyinstaller打包的。在这里我想介绍一下自己手动打包pypy的方法。在网上没有找到pypy打包的程序。因此在这里记录一下我的打包过程。里面有很多东西都是靠自己删除得来的打包得来的。因此比较麻烦。如果有更好的打包的方法,希望能够教我。谢谢大家。需要注意的是,pypy3的路径不能有中文,否则会报错的。同时需要注意的是,我的这些步骤中,难免有一些步骤是不完整的。因此报错的时候需要自己去解决。
配置pypy3环境
首先把下载好的文件解压缩:解压缩后的文件树如下,有些可以删掉的文件在后面备注了。
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020/4/10 15:54 include 可删
d----- 2020/4/10 15:54 lib-python
d----- 2020/4/10 15:54 libs 可删
d----- 2020/4/10 15:54 lib_pypy
d----- 2020/4/10 15:54 site-packages
d----- 2020/4/10 15:54 tcl 需要重命名位lib放入到lib_pypy文件夹下
-a---- 2020/4/7 6:49 36598272 libpypy3-c.dll
-a---- 2020/4/7 6:49 13352 LICENSE 可删
-a---- 2020/4/7 6:49 123904 pypy3.exe
-a---- 2020/4/7 6:49 123904 pypy3w.exe 无控制台窗口的exe
-a---- 2020/4/7 6:49 1142 README.rst 可删
打开cmd,切换到解压后的目录中去。运行pypy3.exe。如果能直接进入到运行界面,则表示能够正常工作了。接下来就是把第三方库导入进去。
导入第三方库
第三方库的导入有很多种方法。
第一种是直接去anaconda的第三方库内把所需的库复制出来。具体需要什么库呢。直接运行pypy.exe。弹出缺少什么库就把这个库给添加上去。
第二种是使用anaconda的pip把第三方库安装到pypy上。这里要使用anaconda的shell,使用的指令为:
python -m pip install python-can --target site-packages
第三种方法是给pypy安装上pip,然后用pip来安装。由于这里还需要安装pip,导致后续软件打包文件变大。因此这里就不使用这种方法了。安装pip的指令为以下,然后会生成一个Scripts文件夹,直接调用这个文件夹下的pip就能下载第三方库了:
pypy3.exe -m ensurepip
将第三方库与自己的程序打包一起
在安装好第三方库之后,使用pypy运行一次程序,如果能够正常工作的话,就可以进入到下一步了。将第三方库与自己的程序打包到一块去。这里用的是python自带的zipapp这个库。具体的使用方法可以百度搜索zipapp的使用方法。
将自己的程序也复制到site-packages这个文件夹内。然后创建一个新的py文件。命名为__main__.py。输入以下
from blf import *
main()
然后使用zipapp,就能生成一个pyz文件。用pypy运行这个文件。其运行效果与之前的运行效果是一样的。
pypy3.exe -m zipapp site-packages
把标准库编译成pyc
使用python的compileall库进行打包。打包的指令为:
pypy3.exe -m compileall -b 目录
然后在cmd中用del指令删除所有的py文件。用文件搜索,把所有的__pycache__文件夹删除。就能得到一个干净的运行目录了。
del /F /Q /S /*.py
把软件打包成单文件格式
这里使用的打包成单文件的方法是使用7z。首先方法是将所有运行的文件打包成一个压缩文件7z。然后用7zSfxTool.exe这个软件将其打包成exe文件。参考链接
首先使用7z将软件所需运行的软件打包成7z。需要注意的是要把压缩算法设置位LZMA。否则后面会报错
接下来就是使用7zSfxTool.exe将这个压缩包编为exe文件。这些步骤在参考链接中已经有了。这里提一下运行软件的设置如下图。相当于打开软件会自动运行 pypy3.exe blf.pyz。
小结
这种打包方式的坏处就是软件在运行的时候要解压很多的文件。导致启动的时候速度非常慢。要达到十秒左右。当然我们也可以删除标准库里面的一些用不上的标准库,以及一些用不上的文件。把软件的体积变小。但是一个个手工删除是太麻烦了。所有需要很大的耐心