大家好,本文将围绕python打包成mac可执行文件展开说明,python打包mac可执行文件是一个很多人都想弄明白的事情,想搞清楚python如何打包程序需要先了解以下几个事情。
目录
2.2 打包成功之后,点击dist文件下的main.exe文件
1. exe文件打包
- 为了方便客户双击执行代码
为客户完成项目的时候,会为了帮助客户方便操作,直接双击执行代码,不需要让其打开脚本文件,利用集成开发环境才可以运行的方式python turtle画简单树。
1.1 需要运用的库
pip install pyinstaller
1.2 打包注意事项:
- 支持mac系统/win系统(win系统建议使用python3.6.8的版本):
- 建议搭配着虚拟环境开发进行开发。
1.3 案例需求举例
- 客户需要一个b站刷播放量的程序
- 对方是一个mac系统
- 对方需要exe文件
1. 在mac系统上开发(提前创建虚拟环境)
2. 开发
3. 开发完成后执行如下命令,将项目所需要的包文件写入txt文件
pip freeze > requirements.txt
4. 打开windows虚拟机
5. 创建虚拟环境
6. 安装项目依赖
pip install -r requirements.txt
7. 安装pyinstaller
执行pyinstaller -F xxxxx:参数
这是在mac系统上开发win系统的可执行文件。
- 如果是在win系统上开发win系统的exe可执行文件
1. win上创建虚拟环境
2. 开发。。。
3. 直接安装pyinstaller
pyinstaller -F xxxx:参数
2. 打包实战
- 将文件所依赖的包写入txt文件
pip freeze > requirements.txt
- 安装pyinstaller
pip install pyinstaller
2.1 多文件打包
pyinstaller -D 文件名字
- 命令演示
- 提示打包成功
2.2 打包成功之后,点击dist文件下的main.exe文件
- 下图是双击运行的cmd窗口
2.3 单文件打包
- 为什么要单文件打包?
原因是因为,代码如果交给一个纯纯小白,不知道点击对应的exe文件才能执行程序代码的话,就需要打包成一个文件这样的话,只需要点击这一个文件就可以执行代码了。
- 打包所需要的命令
pyinstaller -F app.py
上述代码执行成功之后,对应的dist文件下只会出现一个运行程序文件。具体图示如下:
2.4 设置名字参数
pyinstaller -F app.py -n 名字参数
pyinstaller -D app.py -n 名字
2.5 其他命令参数
3. 路径问题
如果代码文件需要读取本地文件的配置文件,假如利用with open语句操作打开文件。
- 多文件打包是不会报错的
- 单文件打包是会报错的
-
- 原因是因为执行文件的时候有因为临时目录的问题存在
3.1 如何解决?
sys.argv[0]
在程序代表的是代码的程序文件所在的文件目录。os.path是临时目录
BASED_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
# 以上代码才会拿到在另外一台计算机上执行程序代码所存储的文件路径。
frozen
- 下面的代码是以一种映射的方式实现拿到exe文件的路径
if getattr(sys, "frozen", False):
BASE_DIR = os.path.dirname(sys.executable)
else:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
#
# -----
# 以下要写的是自己的程序代码
4. 关于导入模块的问题
pyinstaller工具在打包的过程之中,会根据import的调用关系来进行对第三方库或者自定义模块打包。关于动态导入模块的时候只能在临时文件中手动添加所需要的包。
4.1 主程序所依赖的模块
- 会参与打包
所谓主程序所以来的模块,就是直接在主程序中所直接导入的包
4.2 主程序所依赖的模块所依赖的模块。
- 会参与打包
4.3 程序导入的模块未被调用的模块
- 不会被打包进入主程序
4.4 动态导入模块的代码
- 通过字符串的模式进行导包的模块是不会被导入进去的
动态导入包的方式不是直接利用import在代码中导入工具包,而是利用importlib模块中的方法,方法代码如下图。
利用pyinstaller打包文件是不会直接把这种动态导入的包工具一起打包的,因为不可能一边打包一边解析你所写的代码。
(1)解决动态导入模块方法
- 手动添加
-
- 找到打包后所生成的spec文件,将这个临时配置文件中的hiddenimports中添加上所动态导入的包的名字。