社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何将 Python 程序打包成 .exe 文件

不正经程序员 • 7 年前 • 831 次点击  

有不少订阅本公众号的朋友都不是玩 Python 的,甚至都不是计算机相关专业的,当我给他们一个 Python 程序时,他们是完全不知道该怎么运行的。

于是我想是不是可以将我的程序打包成可执行文件,直接运行?

就像这样:

hello

Python 程序都是脚本的方式,一般是在解析器里运行,如果要发布出去,需要提前安装解析器才可以运行,为了在 Windows 里方便发布,只要点击一个 EXE 文件运行,并且打包所需要库文件,这样发布给用户使用就会更方便。

1、PyInstaller 简介

PyInstaller 是一个十分有用的第三方库,可以用来打包 python 应用程序,打包完的程序就可以在没有安装 Python 解释器的机器上运行了。

它能够在 Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个 独立文件方便传递和管理。

PyInstaller 支持 Python 2.7 / 3.4-3.7。可以在 Windows、Mac OS X 和 Linux 上使用,但是并不是跨平台的,而是说你要是希望打包成 .exe 文件,需要在 Windows 系统上运行 PyInstaller 进行打包工作。

下面我们以 Windows 为例来进行程序的打包工作。

2、安装
pip install pyinstaller# 或者python -m pip install pyinstaller

安装成功:

安装成功
3、使用
pyinstaller -F helloworld.py

其中,-F 表示打包成单独的 .exe 文件,这时生成的 .exe 文件会比较大,而且运行速度回较慢。仅仅一个 helloworld 程序,生成的文件就 5MB 大。

另外,使用 -i 还可以指定可执行文件的图标; -w 表示去掉控制台窗口,这在 GUI 界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!

PyInstaller 运行时会对脚本进行解析,并做出如下动作:

1、在脚本目录生成 helloworld.spec 文件;2、创建一个 build 目录;3、写入一些日志文件和中间流程文件到 build 目录;4、创建 dist 目录;5、生成可执行文件到 dist 目录;

执行流程:

$ pyinstaller -F helloworld.py838 INFO: PyInstaller: 3.4839 INFO: Python: 3.4.3841 INFO: Platform: Windows-8-6.2.9200842 INFO: wrote d:\code\Python\pyinstaller\helloworld.spec858 INFO: UPX is not available.885 INFO: Extending PYTHONPATH with paths['d:\\code\\Python\\pyinstaller', 'd:\\code\\Python\\pyinstaller']886 INFO: checking Analysis887 INFO: Building Analysis because Analysis-00.toc is non existent888 INFO: Initializing module dependency graph...890 INFO: Initializing module graph hooks...899 INFO: Analyzing base_library.zip ...6225 INFO: Processing pre-find module path hook   distutils11387 INFO: running Analysis Analysis-00.toc12012 INFO: Caching module hooks...12022 INFO: Analyzing d:\code\Python\pyinstaller\helloworld.py12027 INFO: Loading module hooks...12028 INFO: Loading module hook "hook-encodings.py"...12395 INFO: Loading module hook "hook-xml.py"...13507 INFO: Loading module hook "hook-pydoc.py"...13508 INFO: Loading module hook "hook-distutils.py"...13606 INFO: Looking for ctypes DLLs13662 INFO: Analyzing run-time hooks ...13677 INFO: Looking for dynamic libraries13894 INFO: Looking for eggs13895 INFO: Using Python library C:\WINDOWS\system32\python34.dll13895 INFO: Found binding redirects:[]13915 INFO: Warnings written to d:\code\Python\pyinstaller\build\helloworld\warn-helloworld.txt14035 INFO: Graph cross-reference written to d:\code\Python\pyinstaller\build\helloworld\xref-helloworld.html14287 INFO: checking PYZ14287 INFO: Building PYZ because PYZ-00.toc is non existent14288 INFO: Building PYZ (ZlibArchive) d:\code\Python\pyinstaller\build\helloworld\PYZ-00.pyz15836 INFO: Building PYZ (ZlibArchive) d:\code\Python\pyinstaller\build\helloworld\PYZ-00.pyz completed successfully.15883 INFO: checking PKG15884 INFO: Building PKG because PKG-00.toc is non existent15884 INFO: Building PKG (CArchive) PKG-00.pkg18528 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.18536 INFO: Bootloader D:\program\Python34\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe18537 INFO: checking EXE18537 INFO: Building EXE because EXE-00.toc is non existent18538 INFO: Building EXE from EXE-00.toc18538 INFO: Appending archive to EXE d:\code\Python\pyinstaller\dist\helloworld.exe18548 INFO: Building EXE from EXE-00.toc completed successfully.

运行完成后会生成 build 和 dest 两个目录:

生成两个目录
dest 目录中可以找到可执行 .exe 文件:
生成的可执行文件
4、注意事项

1、直接运行最终的 .exe 程序,可能会出现一闪而过的情况,这种情况下要么是程序运行结束(比如直接打印的 helloWorld),要么程序出现错误退出了。

这种情况下,建议在命令行 cmd 下运行 .exe 文件,这时就会有文本输出到窗口;

2、-i 是改变图标的,但是我发现是有些 bug 的,客官请看:

图标变化

放大过程中,图标才变成了我们设置的图标。

3、写代码的时候应当有个良好的习惯,用什么函数导什么函数,不要上来 import 整个库,最后你会发现你一个 100KB 的代码打包出来有 500MB;

4、当你的代码需要调用一些图片和资源文件的,这是不会自动导入的,需要你自己手动复制进去才行。不然 exe 文件运行时命令窗口会报错找不到这个文件。

导入方法:

假设程序中需要引入一个 test.txt 文件,首先我们运行:

pyi-makespec -F helloworld.py

此时会生成一个 .spec 文件,这个文件会告诉 pyinstaller 如何处理你的脚本,pyinstaller 创建一个 exe 的文件就是依靠它里面的内容进行执行的。

正常情况下你不需要去修改这个 spec 文件,除非你需要打包一个 dll 或者 so 文件或者其他数据文件。

那么我们就需要修改这个 spec 文件:

a = Analysis(['helloworld.py'],             pathex=['/home/test'],             binaries=[],             datas=[],  ### <------- 改

修改为:

a = Analysis(['helloworld.py'],             pathex=['/home/test'],             binaries=[],             datas=[('test.txt','.')],  ## <---- 修改此处添加外部文件

然后在生成 exe 文件:

pyinstaller helloworld.spec

然后生成的文件就可以正常引入外部文件了。

5、总结

本文只是使用 PyInstaller 打包流程进行简单的介绍,更多内容可以参见官方文档:https://pyinstaller.readthedocs.io。

另外,本文是在 Windows10 下运行的,Mac、Linux 也可以打成相应的包,有兴趣的小伙伴在你的 MBP 上试下吧~

欢迎留言交流。

END

本公众号全部博文已整理成一个目录,请在公众号里回复「 1024」获取!

福利   2018 黑马 Python、Java 最新就业班视频,后台回复「2018 」即可获取。
推荐阅读

我的 Python 学习资源分享

你使用频率最高的 Linux 命令是什么?

Python 抓取「知识星球」精华并生成电子书

爬虫小助手 | 自动录制浏览器动作生成 Selenium 脚本

教你用 Python 来朗读网页

Python 爬取「知识星球」

你还在用 format 格式化字符串?

Python 玩转 Excel

你的关注是我持续写作的动力!

戳下面的原文阅读,更有料

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/PuC296ndqM
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24431