将Python脚本打包成可执行文件
Python是一个脚本语言,被解释器解释执行。它的发布方式:
.py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的)
.pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发布后也是跨平台的,需要使用者安装相应版本的Python和依赖库。
可执行文件:对于非码农用户或者一些小白用户,你让他装个Python同时还要折腾一堆依赖库,那简直是个灾难。对于此类用户,最简单的方式就是提供一个可执行文件,只需要把用法告诉Ta即可。比较麻烦的是需要针对不同平台需要打包不同的可执行文件(Windows,Linux,Mac,...)。
本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstaller,其它仅作比较和参考。
Freezing Your Code
各种打包工具的对比如下(来自文章Freezing Your Code):
Solution | Windows | Linux | OS X | Python 3 | License | One-file mode | Zipfile import | Eggs | pkg_resources support |
---|---|---|---|---|---|---|---|---|---|
bbFreeze | yes | yes | yes | no | MIT | no | yes | yes | yes |
py2exe | yes | no | no | yes | MIT | yes | yes | no | no |
pyInstaller | yes | yes | yes | no | GPL | yes | no | yes | no |
cx_Freeze | yes | yes | yes | yes | PSF | no | yes | yes | no |
py2app | no | no | yes | yes | MIT | no | yes | yes | yes |
PS.其中pyInstaller和cx_Freeze都是不错的,stackoverflow上也有人建议用cx_Freeze,说是更便捷些。pkg_resources新版的pyInstaller貌似是支持的。
安装PyInstaller
对于那些网络比较稳定,能够流畅使用pip源地址的用户,直接下面的命令就可以搞定:
pip install pyinstaller
通常我们会下载源码包,然后进入包目录,执行下面的命令(需要安装setuptools):
python setup.py install
安装完后,检查安装成功与否:
pyinstaller --version
安装成功后,就可以使用下面的命令了:
pyinstaller
: 打包可执行文件的主要命令,详细用法下面会介绍。pyi-archive_viewer
: 查看可执行包里面的文件列表。pyi-bindepend
: 查看可执行文件依赖的动态库(.so或.dll文件)pyi-...
: 等等。
使用PyInstaller
pyinstaller
的语法:
pyinstaller [options] script [script ...] | specfile
最简单的用法,在和myscript.py同目录下执行命令:
pyinstaller mycript.py
然后会看到新增加了两个目录build和dist,dist下面的文件就是可以发布的可执行文件,对于上面的命令你会发现dist目录下面有一堆文件,各种都动态库文件和myscrip可执行文件。有时这样感觉比较麻烦,需要打包dist下面的所有东西才能发布,万一丢掉一个动态库就无法运行了,好在pyInstaller支持单文件模式,只需要执行:
pyinstaller -F mycript.py
你会发现dist下面只有一个可执行文件,这个单文件就可以发布了,可以运行在你正在使用的操作系统类似的系统的下面。
当然,pyinstaller
还有各种选项,有通用选项,如-d选项用于debug,了解pyInstaller执行的过程;还有一些针对不同平台的选项,具体用法可以访问PyInstaller官方WIKI。
在执行pyInstaller
命令的时候,会在和脚本相同目录下,生成一个.spec
文件,该文件会告诉pyinstaller如何处理你的所有脚本,同时包含了命令选项。一般我们不用去理会这个文件,若需要打包数据文件,或者给打包的二进制增加一些Python的运行时选项时...一些高级打包选项时,需要手动编辑.spec
文件。可以使用:
pyi-makespec options script [script ...]
创建一个.spec文件,对于手动编辑的.spec文件,我们可以使用下面任意一条命令:
pyinstaller specfile
pyi-build specfile
PyInstaller的原理简介
PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装python和你的脚本依赖的库。在Linux操作系统下,它主要用的binutil
工具包里面的ldd
和objdump
命令。
PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括Python解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。
可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含的,不需要安装其他包,或某个版本的Python,就可以直接运行了。
需要注意的是,PyInstaller打包的执行文件,只能在和打包机器系统同样的环境下。也就是说,不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包。
参考资料
- Freezing Your Code
- PyInstaller官方WIKI
- PyInstaller源码
将Python脚本打包成可执行文件相关推荐
- 【Python实用技巧】如何将Python脚本打包成exe可执行文件?
相信大家也有过这样的困惑,本来已经使用Python写好了脚本代码,又不想公开代码逻辑,但又要给别人使用这些功能? 这可怎么办呢? 有没有什么办法,可以将Python脚本打包成一个exe文件,这样发布的 ...
- python 没反应 生成exe_通过 pyinstaller 将 python 脚本打包成可执行程序!
1. 引言 很多时候,我们需要在 windows 环境编写和执行 python 脚本,但是去搭建一整套 python 运行环境看上去就过于繁琐了,即便是拥有 python 运行环境,脚本的执行也并不方 ...
- pyqt打包成linux可执行程序,PyQtopencv图像处理(5):python程序打包成可执行文件...
让我们稍微休息一下,来把我们目前写好的小程序打包成.exe文件. python程序打包有一些方法,py2exe和pyinstaller.其中py2exe的安装比较方便,但是打包起来比较麻烦:而pyin ...
- Ubuntu下将python程序打包成可执行文件
pyinstaller是一个python代码的打包神器,它可以将python源代码打包成一个可执行文件,从而做到对外暴露可用功能并隐藏具体实现的功能.这篇博客主要想说一下在ubuntu下如何使用pyi ...
- 利用pyinstaller将python项目脚本打包成可执行文件
利用pyinstaller打包python项目 由于本文讲述还算比较详细,如果对pyinstaller有一定的了解,只需快速上手,可以直接跳到第四章结合实例进行操作. 1简介及安装pyinstalle ...
- 将python程序打包成可执行文件exe
我们开发的脚本一般都会用到一些第三方包,可能别人也需要用到我们的脚本,如果我们将我们的xx.py文件发给他,他是不能直接用的,他还需要安装python解释器,甚至还要安装我们用的那些第三方包,是不是有 ...
- 如何将python脚本打包成10多M的exe?
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...
- python打包成可执行文件给 别人用下载_调试Python程序打包成可执行文件
用Python编好了程序,如果给别人运行,别人的电脑不一安装了Python,而且这些源程序也不利于代码的保持.因此很有需要把Python程序打包成EXE可执行文件. 查阅了相关文章,开始了我的调试之路 ...
- Python 文件打包成可执行文件
import randomwhile True:#系统给出随机数字sys_num = random.randint(1,10)print(sys_num)while True:print(" ...
最新文章
- 顶一下吧﹗成功配置Samba3.0为域登录和文件服务器的方法!!! [转]
- Objective-C:保留计数器思想的详解(对象的保留和所有权的释放)
- Swoft 源码剖析 - Swoft 中的注解机制
- opencv阈值化(五)
- Android WebView常见问题及解决方案汇总
- 微擎支付返回商户单号_一步一步教你在SpringBoot中集成微信扫码支付
- 思源高拍仪万能驱动_动态展示和教学 良田YL1050AF高拍仪评测
- 根据后序和中序求二叉树的层序
- java jna调用dll文件_关于java jna调用dll的问题
- java 使用qq邮箱发送邮件报错 port: 465, response: 550 错误
- 电信光猫超级密码破解
- mapbox/minemap 获取比例尺
- 台式计算机开不了机,台式电脑开不了机
- 【数据分析】快速获取微博用户数据,图片,视频
- php compress.zlib_compress/zlib(压缩/zlib)
- 重温数据结构(C语言版)(第二版)
- 高层要有事业心,中层要有进取心,基层要有责任心!
- postgresql中patroni集群备库手动还原后,hac启动日志比主库多1
- html求正方形面积,利用js计算正方形的面积的方法介绍
- Python 《Hamlet》哈姆雷特英文词频统计
热门文章
- linux笔记之 vi编辑器和用户的配置文件及提权
- Java中的DatagramPacket与DatagramSocket的初步
- Xcode搭建真机调试环境 图文实例
- m3u8地址_「波波带你手动提取网页视频」04讲 Network和Elements提取m3u8链接
- 西门子s7-200解密软件下载_西门子S7200仿真软件如何使用?
- html5调盒子边框大小,CSS3 - 盒子大小(CSS3 - Box Sizing)
- 提供呼叫中心服务器,呼叫中心系统方案
- 计算机操作简介,什么是计算机操作的快捷键?计算机操作快捷方式简介
- android新建view类,android – 无法创建ViewModel类的实例(无法启动活动ComponentInfo)
- 高级程序设计c语言试卷答案,高级程序设计语言半期试卷答案.doc