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工具包里面的lddobjdump命令。

PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括Python解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。

可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含的,不需要安装其他包,或某个版本的Python,就可以直接运行了。

需要注意的是,PyInstaller打包的执行文件,只能在和打包机器系统同样的环境下。也就是说,不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包。

参考资料

  1. Freezing Your Code
  2. PyInstaller官方WIKI
  3. PyInstaller源码

将Python脚本打包成可执行文件相关推荐

  1. 【Python实用技巧】如何将Python脚本打包成exe可执行文件?

    相信大家也有过这样的困惑,本来已经使用Python写好了脚本代码,又不想公开代码逻辑,但又要给别人使用这些功能? 这可怎么办呢? 有没有什么办法,可以将Python脚本打包成一个exe文件,这样发布的 ...

  2. python 没反应 生成exe_通过 pyinstaller 将 python 脚本打包成可执行程序!

    1. 引言 很多时候,我们需要在 windows 环境编写和执行 python 脚本,但是去搭建一整套 python 运行环境看上去就过于繁琐了,即便是拥有 python 运行环境,脚本的执行也并不方 ...

  3. pyqt打包成linux可执行程序,PyQtopencv图像处理(5):python程序打包成可执行文件...

    让我们稍微休息一下,来把我们目前写好的小程序打包成.exe文件. python程序打包有一些方法,py2exe和pyinstaller.其中py2exe的安装比较方便,但是打包起来比较麻烦:而pyin ...

  4. Ubuntu下将python程序打包成可执行文件

    pyinstaller是一个python代码的打包神器,它可以将python源代码打包成一个可执行文件,从而做到对外暴露可用功能并隐藏具体实现的功能.这篇博客主要想说一下在ubuntu下如何使用pyi ...

  5. 利用pyinstaller将python项目脚本打包成可执行文件

    利用pyinstaller打包python项目 由于本文讲述还算比较详细,如果对pyinstaller有一定的了解,只需快速上手,可以直接跳到第四章结合实例进行操作. 1简介及安装pyinstalle ...

  6. 将python程序打包成可执行文件exe

    我们开发的脚本一般都会用到一些第三方包,可能别人也需要用到我们的脚本,如果我们将我们的xx.py文件发给他,他是不能直接用的,他还需要安装python解释器,甚至还要安装我们用的那些第三方包,是不是有 ...

  7. 如何将python脚本打包成10多M的exe?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  8. python打包成可执行文件给 别人用下载_调试Python程序打包成可执行文件

    用Python编好了程序,如果给别人运行,别人的电脑不一安装了Python,而且这些源程序也不利于代码的保持.因此很有需要把Python程序打包成EXE可执行文件. 查阅了相关文章,开始了我的调试之路 ...

  9. Python 文件打包成可执行文件

    import randomwhile True:#系统给出随机数字sys_num = random.randint(1,10)print(sys_num)while True:print(" ...

最新文章

  1. 顶一下吧﹗成功配置Samba3.0为域登录和文件服务器的方法!!! [转]
  2. Objective-C:保留计数器思想的详解(对象的保留和所有权的释放)
  3. Swoft 源码剖析 - Swoft 中的注解机制
  4. opencv阈值化(五)
  5. Android WebView常见问题及解决方案汇总
  6. 微擎支付返回商户单号_一步一步教你在SpringBoot中集成微信扫码支付
  7. 思源高拍仪万能驱动_动态展示和教学 良田YL1050AF高拍仪评测
  8. 根据后序和中序求二叉树的层序
  9. java jna调用dll文件_关于java jna调用dll的问题
  10. java 使用qq邮箱发送邮件报错 port: 465, response: 550 错误
  11. 电信光猫超级密码破解
  12. mapbox/minemap 获取比例尺
  13. 台式计算机开不了机,台式电脑开不了机
  14. 【数据分析】快速获取微博用户数据,图片,视频
  15. php compress.zlib_compress/zlib(压缩/zlib)
  16. 重温数据结构(C语言版)(第二版)
  17. 高层要有事业心,中层要有进取心,基层要有责任心!
  18. postgresql中patroni集群备库手动还原后,hac启动日志比主库多1
  19. html求正方形面积,利用js计算正方形的面积的方法介绍
  20. Python 《Hamlet》哈姆雷特英文词频统计

热门文章

  1. linux笔记之 vi编辑器和用户的配置文件及提权
  2. Java中的DatagramPacket与DatagramSocket的初步
  3. Xcode搭建真机调试环境 图文实例
  4. m3u8地址_「波波带你手动提取网页视频」04讲 Network和Elements提取m3u8链接
  5. 西门子s7-200解密软件下载_西门子S7200仿真软件如何使用?
  6. html5调盒子边框大小,CSS3 - 盒子大小(CSS3 - Box Sizing)
  7. 提供呼叫中心服务器,呼叫中心系统方案
  8. 计算机操作简介,什么是计算机操作的快捷键?计算机操作快捷方式简介
  9. android新建view类,android – 无法创建ViewModel类的实例(无法启动活动ComponentInfo)
  10. 高级程序设计c语言试卷答案,高级程序设计语言半期试卷答案.doc