『Python』Python 编译成计算机可执行文件(Windows 计算机可执行文件 exe,Linux 计算机可执行文件 elf,Mac 计算机可执行文件 mach-O)
@[toc]
背景:
Python 程序都是脚本的方式,一般是在解析器里运行,如果要想要给别的计算机使用,需要提前安装 Python 解析器和相关包才可以运行,为了在 Windows(或其它系统里) 里方便发布,我们将.py
文件,编译成一个可执行文件,并且打包所需要库文件,只需要点击一个可执行文件运行,而无需安装 Python 和相关库文件。这样发布给用户使用何不美哉。
我们的主角 :PyInstaller
PyInstaller 是一个十分有用的第三方库,可以用来打包 python 应用程序,打包完的程序就可以在没有安装 Python 解释器的机器上运行了。
PyInstaller 将 Python 应用程序冻结(打包)在 Windows,GNU / Linux,Mac OS X,FreeBSD,Solaris 和 AIX 下的独立可执行文件中。
与类似工具相比,PyInstaller 的主要优势在于 PyInstaller 可与 Python 2.7 和 3.5-3.7 一起使用;由于透明压缩,它可生成较小的可执行文件;它是完全多平台的;并且使用 OS 支持来加载动态库,从而确保完全兼容。
PyInstaller 的主要目标是开箱即用地与第三方软件包兼容。这意味着,使用 PyInstaller,使外部软件包正常工作所需的所有技巧已 集成在 PyInstaller 本身中,因此无需用户干预。您将不需要在 Wiki 中寻找技巧,也可以对文件或设置脚本进行自定义修改。例如,完全支持 PyQt,Django 或 matplotlib 之类的库,而无需手动处理插件或外部数据文件。
使用
1.安装 pyinstaller
2.进入安装工作环境
Win+R 运行打开 CMD
进入工作目录,即所编译.py
文件的路径
右键点击 Python 文件,属性中即可获得路径。
利用 cd 命令进入工作目录:
3. 生成不自定义图标的 exe 文件
1
| pyinstaller -F -w game.py (-F表示打包单个文件,-w是为了打开exe时候不弹出黑框)
|
4.生成带自定义图标的 exe 文件
1
| pyinstaller -F -w -i use.ico demo.py (-i用来设置编译成exe文件的图标,后面跟.ico格式的图片文件)
|
PyInstaller 支持的常用选项
-h,--help |
查看该模块的帮助信息 |
-F,-onefile |
产生单个的可执行文件 |
-D,--onedir |
产生一个目录(包含多个文件)作为可执行程序 |
-a,--ascii |
不包含 Unicode 字符集支持 |
-d,--debug |
产生 debug 版本的可执行文件 |
-w,--windowed,--noconsolc |
指定程序运行时不显示命令行窗口(仅对 Windows 有效) |
-c,--nowindowed,--console |
指定使用命令行窗口运行程序(仅对 Windows 有效) |
-o DIR,--out=DIR |
指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件 |
-p DIR,--path=DIR |
设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径 |
-n NAME,--name=NAME |
指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字 |
PyInstaller 会对脚本进行解析,并做出如下动作:
在工作目录生成 helloworld.spec 文件;
创建一个 build 文件夹;
写入一些日志文件和中间流程文件到 build 文件夹;
创建 dist 文件夹;
生成可执行文件到 dist 文件夹;
如果编译中出现错误,会生成 debug.log 的日志文件;
内部流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| C:\Users\张小胖\Desktop>pyinstaller -F -w demo.py 46 INFO: PyInstaller: 3.6 47 INFO: Python: 3.8.2 47 INFO: Platform: Windows-10-10.0.18362-SP0 49 INFO: wrote C:\Users\张小胖\Desktop\demo.spec 50 INFO: UPX is not available. 51 INFO: Extending PYTHONPATH with paths ['C:\\Users\\张小胖\\Desktop', 'C:\\Users\\张小胖\\Desktop'] 51 INFO: checking Analysis 52 INFO: Building Analysis because Analysis-00.toc is non existent 52 INFO: Initializing module dependency graph... 54 INFO: Caching module graph hooks... 78 INFO: Analyzing base_library.zip ... 2072 INFO: Processing pre-find module path hook distutils 2073 INFO: distutils: retargeting to non-venv dir 'c:\\users\\张小胖\\appdata\\local\\programs\\python\\python38\\lib' 4270 INFO: Caching module dependency graph... 4365 INFO: running Analysis Analysis-00.toc 4367 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by c:\users\张小胖\appdata\local\programs\python\python38\python.exe 4630 INFO: Analyzing C:\Users\张小胖\Desktop\demo.py 4757 INFO: Processing pre-safe import module hook urllib3.packages.six.moves c:\users\张小胖\appdata\local\programs\python\python38\lib\site-packages\selenium\webdriver\firefox\firefox_profile.py:208: SyntaxWarning: "is" with a literal. Did you mean "=="? if setting is None or setting is '': 6324 INFO: Processing module hooks... 6324 INFO: Loading module hook "hook-certifi.py"... 6327 INFO: Loading module hook "hook-distutils.py"... 6330 INFO: Loading module hook "hook-encodings.py"... 6390 INFO: Loading module hook "hook-lib2to3.py"... 6396 INFO: Loading module hook "hook-pydoc.py"... 6397 INFO: Loading module hook "hook-selenium.py"... 6408 INFO: Loading module hook "hook-sysconfig.py"... 6409 INFO: Loading module hook "hook-xml.dom.domreg.py"... 6410 INFO: Loading module hook "hook-xml.etree.cElementTree.py"... 6416 INFO: Loading module hook "hook-xml.py"... 6418 INFO: Loading module hook "hook-_tkinter.py"... 6555 INFO: checking Tree 6555 INFO: Building Tree because Tree-00.toc is non existent 6556 INFO: Building Tree Tree-00.toc 6668 INFO: checking Tree 6668 INFO: Building Tree because Tree-01.toc is non existent 6669 INFO: Building Tree Tree-01.toc 6723 INFO: Looking for ctypes DLLs 6755 INFO: Analyzing run-time hooks ... 6759 INFO: Including run-time hook 'pyi_rth__tkinter.py' 6762 INFO: Including run-time hook 'pyi_rth_multiprocessing.py' 6765 INFO: Including run-time hook 'pyi_rth_certifi.py' 6775 INFO: Looking for dynamic libraries 6862 WARNING: lib not found: pywintypes38.dll dependency of c:\users\张小胖\appdata\local\programs\python\python38\lib\site-packages\win32\win32evtlog.pyd 6870 WARNING: lib not found: pywintypes38.dll dependency of c:\users\张小胖\appdata\local\programs\python\python38\lib\site-packages\win32\win32api.pyd 6925 WARNING: lib not found: pywintypes38.dll dependency of c:\users\张小胖\appdata\local\programs\python\python38\lib\site-packages\win32\win32wnet.pyd 7017 INFO: Looking for eggs 7018 INFO: Using Python library c:\users\张小胖\appdata\local\programs\python\python38\python38.dll 7019 INFO: Found binding redirects: [] 7025 INFO: Warnings written to C:\Users\张小胖\Desktop\build\demo\warn-demo.txt 7089 INFO: Graph cross-reference written to C:\Users\张小胖\Desktop\build\demo\xref-demo.html 7130 INFO: checking PYZ 7130 INFO: Building PYZ because PYZ-00.toc is non existent 7134 INFO: Building PYZ (ZlibArchive) C:\Users\张小胖\Desktop\build\demo\PYZ-00.pyz 7971 INFO: Building PYZ (ZlibArchive) C:\Users\张小胖\Desktop\build\demo\PYZ-00.pyz completed successfully. 7989 INFO: checking PKG 7989 INFO: Building PKG because PKG-00.toc is non existent 7989 INFO: Building PKG (CArchive) PKG-00.pkg 10434 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 10460 INFO: Bootloader c:\users\张小胖\appdata\local\programs\python\python38\lib\site-packages\PyInstaller\bootloader\Windows-64bit\runw.exe 10460 INFO: checking EXE 10460 INFO: Building EXE because EXE-00.toc is non existent 10461 INFO: Building EXE from EXE-00.toc 10463 INFO: Appending archive to EXE C:\Users\张小胖\Desktop\dist\demo.exe 10474 INFO: Building EXE from EXE-00.toc completed successfully.
|
写在最后:
Name:风骨散人,目前是一名双非在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!名字的含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 …”
文章主要内容:
Python,C++,C 语言,JAVA,C#等语言的教程
ACM 题解、模板、算法等,主要是数据结构,数学和图论
设计模式,数据库,计算机网络,操作系统,计算机组成原理
Python 爬虫、深度学习、机器学习
计算机系408考研的所有专业课内容
目前还在更新中,先关注不迷路。微信公众号,cnblogs(博客园),CSDN 同名“风骨散人”
如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
感谢大家的阅读!😘 你的点赞、收藏、关注是对我最大的鼓励!