#Python #日常技巧 #功能 将Python文件编译或打包成可执行(EXE)文件

作者:彭_Yu
转载请先联系pengyu717@163.com并注明原文链接:https://www.cnblogs.com/pyublog/p/16988717.html否则为侵权行为!


目的:将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

posted @   彭_Yu  阅读(547)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示

目录导航