Python是一种高级编程语言,它具有易学易用、跨平台等优点,因此在开发中得到了广泛的应用。然而,Python代码需要在Python解释器中运行,这对于一些用户来说可能不太方便。Python作为解释型语言,发布即公开源码,虽然是提倡开源但是有些时候就是忍不住想打包成exe,不仅仅是为了对代码进行加密,而是为了跨平台。防止有些没有安装py环境的电脑无法运行软件。
因此,将Python代码打包成可执行文件(exe)是一种很好的解决方案。本文将分析几种打包方式的优缺点。
01
使用pyinstaller
pyinstaller是一个流行的Python打包工具,它可以将Python代码打包成独立的可执行文件。
使用pyinstaller打包Python代码非常简单,只需要在命令行中输入以下命令:pyinstaller your_script.py
这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。
02
使用cx_Freeze
cx_Freeze是另一个流行的Python打包工具,它可以将Python代码打包成独立的可执行文件。
使用cx_Freeze打包Python代码也很简单,只需要在命令行中输入以下命令:cxfreeze your_script.py --target-dir dist
这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。
03
使用py2exe
py2exe是一个Python打包工具,它可以将Python代码打包成Windows可执行文件。
使用py2exe打包Python代码也很简单,只需要在命令行中输入以下命令:python setup.py py2exe
这将生成一个Windows可执行文件。
04
使用py2app
py2app是一个Python打包工具,它可以将Python代码打包成MacOS可执行文件。
使用py2app打包Python代码也很简单,只需要在命令行中输入以下命令:python setup.py py2app
这将生成一个MacOS可执行文件。
05
使用Nuitka
Nuitka是一个Python编译器,它可以将Python代码编译成C++代码,然后将其打包成可执行文件。
使用Nuitka打包Python代码也很简单,只需要在命令行中输入以下命令:nuitka your_script.py
这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。
06
使用Nuitka+pyinstaller
Nuitka和pyinstaller可以结合使用,将Python代码编译成C++代码,然后使用pyinstaller将其打包成可执行文件。
使用Nuitka+pyinstaller打包Python代码也很简单,只需要在命令行中输入以下命令:
nuitka --standalone your_script.py
pyinstaller your_script.spec
这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。
07
总结
本文介绍了6种将Python代码打包成exe应用的方式,包括pyinstaller、cx_Freeze、py2exe、py2app、Nuitka和Nuitka+pyinstaller。每种方式都有其优点和缺点。比如pyinstaller,也是我最常用的。
优点:可将python文件转成可执行文件;跨平台;输出的可以是单一目录,也可以是一个单独的打好包的可执行文件;py2exe貌似输出目录;智能支持python的第三方模块如PyQt,外部数据文件等;支持EGG格式文件;可执行文件可以用UPX压缩,二进制压缩方式;支持控制台和视窗两种方式;可以选择exe文件的图标 (Windows only);支持 COM server (Windows only)。
缺点:import导入的问题:pyinstaller是很智能的,只要指定了入口py文件,那么它就会根据代码自动查找需要导入的包。但是隐式导入的话,平常运行是没有问题的。例子:
# test1.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DB_CONNECT_STRING = ‘mysql+pymysql://root:123456@localhost/study’
engine = create_engine(DB_CONNECT_STRING, echo = False)
DB_Session = sessionmaker(bind = engine)
session = DB_Session()
print(‘this is my test’)
运行这个ORM库的初始化引擎,是没有问题的,在console得到结果:this is my test
那么我们开始打包,使用最简单的pyinstaller test1.py。打包完成后,在当前目录下有个dist文件夹,进入dist下的test1文件夹,然后打开cmd,运行这个exe,我们就会发现:
提示:no model named ‘pymysql’
这是怎么回事呢?那么问题来了,sqlalchemy这个库在初始化的时候是不需要显示导入引擎库的,它自己有一个create_engine()的函数来初始化,这个字符串是使用者根据规则来自己填写的。其实解决的方法很简单,我们只要在显式导入pymysql这个库即可。现在我们导入这个库:import pymysql
重新打包一遍(重新打包的时候记得删除掉spec文件,否则会有缓存,或者是加上——clean选项清除掉),再次运行,现在就没有这个问题了。
多进程打包的问题
官方的CPython存在一个GIL锁,这个锁的存在有很多优点,很多库都是线程安全的,单线程执行的效率也高。在python早期的一个版本中取消掉了GIL,代之以高粒度的锁来实现多线程,但是实际应用中单个线程的效率大大降低。故后来又将GIL这个锁还原回去,所以至今的python2也好还是python3中都会有这个锁。但是这个锁有很大一个问题,那就是效率问题,它导致了python仅仅只能利用一个core来进行数据的计算。所以后面为了弥补这个GIL带来的问题,专家们设计了multiprocessing库,gevent库等。
前一个是多进程库,为了解决python用于数据密集型处理的情况;后一个用于异步IO处理的情况,基本原理就是在CPU时钟之间来回切换,简单的例子就是爬虫程序爬取网页的时候。假如有10个url,我们都要去GET它,实际上网络之间的延迟是大大高于计算机内部的,那么这个时间内计算机就切换到下一个。有时候运用多进程是必须的,这个替代不了,哪怕它占用资源很多。
总之开发者可以根据自己的需求选择合适的方式。无论选择哪种方式,都可以将Python代码打包成独立的可执行文件,方便用户使用。
本文转自网络,如有侵权,请联系删除。
学习资源推荐
除了上述分享,如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。
这里给大家展示一下我进的兼职群和最近接单的截图
![私单](https://i-blog.csdnimg.cn/blog_migrate/6c90c22f0bd0e974988bee3ba2527df7.png)
😝朋友们如果有需要的话,可以点击下方链接领取或者V扫描下方二维码联系领取
🎁 CSDN大礼包,二维码失效时,点击这里领取👉:【学习资料合集&相关工具&PyCharm永久使用版获取方式】
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
![](https://i-blog.csdnimg.cn/blog_migrate/5820b77ba506d19ec550af517c4607ef.png)