#Python #日常技巧 #功能 将Python文件编译或打包成可执行(EXE)文件
目的:将Python文件编译为exe文件后,可以直接在Windows上运行,不需要再依赖Python环境,可以复制到其他电脑中直接使用,较为方便。
1.安装编译工具
pyinstaller是Python中将py文件编译成为exe文件的免费工具,较为好用,在Windows中,pyinstaller依赖pywin32,所在如果打包有问题请先安装pywin32模块,在Windows命令提示符中安装命令如下:
来源于互联网的pyinstaller资料,仅供参考。https://so.csdn.net/so/search?q=pyinstaller&spm=1001.2101.3001.7020
Windows命令提示符
pip install pywin32
pip install pyinstaller
2. 编译命令
2.1 运行时出现dos命令窗口
pyinstaller -F 文件名.py
2.2 运行时不出现dos命令窗口
在将带有tkinter等界面打包成exe时,运行exe文件的时候,会弹出一个DOS命令窗口,这个窗口可以看到一些打印信息,如果想只运行tkinter 页面,去掉dos命令窗口,需要在打包的时候 加上: -w
pyinstaller -F test.py -w
2.3 更多扩展命令
生成
-D, --onedir
创建一个包含可执行文件的单文件夹包(默认)
-F, --onefile
创建一个单一文件捆绑的可执行文件。
--specpath DIR
存放生成的spec文件的文件夹(默认:当前目录)
-n NAME, --name NAME
分配给捆绑的应用程序和规范文件的名称(默认值:第一个脚本的基本名称) [2]
Windows 和 Mac OS特定选项
-c, --console, --nowindowed
打开标准 i/o 的控制台窗口(默认)。在 Windows 上,如果第一个脚本是“.pyw”文件,则此选项无效。
-w, --windowed, --noconsole
Windows 和 Mac OS X:不为标准 i/o 提供控制台窗口。在 Mac OS 上,这也会触发构建 Mac OS .app 包。在 Windows 上,如果第一个脚本是“.pyw”文件,则会自动设置此选项。此选项在 UNIX 系统上被忽略。
-i <FILE.ico or FILE.exe,ID or FILE.icns or Image or “NONE”>, --icon <FILE.ico or FILE.exe,ID or FILE.icns or Image or “NONE”>
FILE.ico:将图标应用于 Windows 可执行文件。
FILE.exe,ID:从exe中提取带有ID的图标。
FILE.icns:将图标应用到 Mac OS 上的 .app 包。如果输入的图像文件不是平台格式(Windows 上的 ico,Mac 上的 icns),PyInstaller 会尝试使用 Pillow 将图标转换为正确的格式(如果安装了 Pillow)。
使用“NONE”不应用任何图标,从而使操作系统显示一些默认值(默认值:应用 PyInstaller 的图标)
其他参数
-h, --help
显示此帮助信息并退出
-v, --version
显示程序版本信息并退出。
--distpath DIR
捆绑应用程序的放置位置(默认:./dist)
--workpath WORKPATH
将所有临时工作文件、.log、.pyz 等放在哪里(默认:./build)
-y, --noconfirm
替换输出目录(默认:SPECPATH/dist/SPECNAME)而不要求确认
--upx-dir UPX_DIR
UPX 实用程序的路径(默认:搜索执行路径)
-a, --ascii
不包括 unicode 编码支持(默认:如果可用,包括在内)
--clean
在构建之前清理 PyInstaller 缓存并删除临时文件。
--log-level LEVEL
构建时控制台消息中的详细信息量。LEVEL 可以是 TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL 之一(默认值:INFO)。
3. 编译后exe文件太大问题
3.1 可能遇到的问题
很多时候,我们的Python脚本文件本身是很小的,才几十KB,但编译后达到几十MB甚至上百MB,主要原因是在编译时会把Python环境及库一起打包到exe文件中,如果我们的Python环境中安装了很多包,比如通过Anaconda安装的Python环境时,通过会安装了很多Python库,如果在此环境中进行编译,那么就会把所有的库带上,导致编译后的exe文件很大。
3.2 解决办法
为该文件单独创建相应的Python虚拟环境,只安装要编译Python文件所依赖的库(导入到该Python文件中的库),在该虚拟环境中安装pyinstaller编译工具(这点很重要),然后运行该虚拟环境,在虚拟环境下执行编译,这时文件就会小很多。
经测试十分有效,单独创建Python虚拟环境后编译,exe文件大小由原来的95MB减少到16MB,运行速度也快了10倍,原来界面加载出来要40~50秒,现在只要不到5秒。
3.3 Windows环境下虚拟环境创建方法
安装virtualenv:
pip install virtualenv
然后创建一个虚拟环境:
virtualenv py2exe_env # 命名请自定义
创建完成以后,我们就会在创建的文件夹里发现虚拟环境命名的文件夹py2exe_env:
创建完成以后,我们就会在创建的文件夹里发现虚拟环境命名的文件夹py2exe_env
然后cd 到虚拟环境py2exe_env的Script目录下,输入如下命令启动虚拟环境:
pyinstaller -F 文件名.py -w # 运行时不出现dos命令窗口
&或者:
pyinstaller -F 文件名.py # 运行时出现dos命令窗口
这样就可以将Python代码文件编译成较小的exe文件!
4. 打包selenium脚本时集成chromedriver.exe的问题
采用pyinstaller 打包selenium项目时,一般需要再同级目录中添加谷歌浏览器chromedriver.exe驱动,否则会报错。在转发给其他人使用时,还要附带一个驱动,就会很不方便。通过如下方法可以解决此问题。
4.1 在代码中添加chromedriver.exe的路径
解决问题的关键,在代码中添加sys._MEIPASS路径,代码如下:
import sys
def getDriver():
if getattr(sys, 'frozen', False):
# 从exe包里找chromedriver依赖驱动的情况
chromedriver_path = os.path.join(sys._MEIPASS, "chromedriver.exe")
driver = webdriver.Chrome(chromedriver_path)
else:
# 普通情况下从本地文件路径找依赖的情况
driver = webdriver.Chrome(executable_path='本地chromedriver的路径') # 修改为自己电脑中chromedriver的路径
return driver
if __name__ == '__main__':
driver = getDriver()
driver.get('https://www.baidu.com')
#无论是本地调试还是打包成exe都不会再报错了。
注意:用 pyinstaller 打包生成的 exe 文件,在运行时动态生成依赖文件,sys._MEIPASS就是这些依赖文件所在文件夹的路径,通常为 C:\Windows\Temp_MEIxxxx 或C:\Users\用户名\AppData\Local\Temp_MEIxxxx,仅在 exe运行时有效,IDE运行时报错,因此需要通过判定条件兼顾。
4.2 打包时把chromedriver.exe添加进去
用pyinstaller打包时,把chromedriver.exe添加进去,重新打包,然后就可以使用了,打包命令如下:
pyinstaller -F --add-binary "chromedriver.exe";"." 文件名.py # 把文件名换成你的文件名
打包完成后:,sepc文件中会出现添加了chromedriver.exe驱动,如下图所示:
您也可以参考以下资料:
https://www.jianshu.com/p/2c7c7dd602e2
https://www.zhihu.com/question/281858271
https://blog.csdn.net/wuchenlhy/article/details/81947159
https://blog.csdn.net/xiaofeixia666888/article/details/107258470/
https://blog.csdn.net/sinat_36797467/article/details/120288627?spm=1001.2014.3001.5501
https://blog.csdn.net/MAOZEXIJR/article/details/91971027
感谢您的阅读,如觉得有用请您点赞,您的鼓励是对我的最大动力!
END
2022/11/27
联系我:pengyu717@yeah.net
本文作者:彭_Yu
转载请先联系pengyu717@163.com并注明原文链接:
https://www.cnblogs.com/pyublog/p/16988717.html否则为侵权行为!