当前位置:网站首页 > 技术博客 > 正文

python如何打包程序



       Python是一种高级编程语言,它具有易学易用、跨平台等优点,因此在开发中得到了广泛的应用。然而,Python代码需要在Python解释器中运行,这对于一些用户来说可能不太方便。Python作为解释型语言,发布即公开源码,虽然是提倡开源但是有些时候就是忍不住想打包成exe,不仅仅是为了对代码进行加密,而是为了跨平台。防止有些没有安装py环境的电脑无法运行软件。

       因此,将Python代码打包成可执行文件(exe)是一种很好的解决方案。本文将分析几种打包方式的优缺点。

       使用pyinstaller打包Python代码非常简单,只需要在命令行中输入以下命令:pyinstaller your_script.py

       这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。

       使用cx_Freeze打包Python代码也很简单,只需要在命令行中输入以下命令:cxfreeze your_script.py --target-dir dist

       这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。

       使用py2exe打包Python代码也很简单,只需要在命令行中输入以下命令:python setup.py py2exe

       这将生成一个Windows可执行文件。

使用py2app打包Python代码也很简单,只需要在命令行中输入以下命令:python setup.py py2app

这将生成一个MacOS可执行文件。

       使用Nuitka打包Python代码也很简单,只需要在命令行中输入以下命令:nuitka your_script.py

       这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。

       使用Nuitka+pyinstaller打包Python代码也很简单,只需要在命令行中输入以下命令:

       nuitka --standalone your_script.py         

       pyinstaller your_script.spec

       这将生成一个可执行文件,可以在Windows、Linux和MacOS上运行。

       优点:可将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:@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它,实际上网络之间的延迟是大大高于计算机内部的,那么这个时间内计算机就切换到下一个。有时候运用多进程是必须的,这个替代不了,哪怕它占用资源很多。

          本文转自《电脑报》2023年9月18日第15版

版权声明


相关文章:

  • 小程序码怎么生成二维码2025-04-18 07:00:59
  • cpu压力测试多少度正常2025-04-18 07:00:59
  • 二叉排序树构造2025-04-18 07:00:59
  • java集合怎么转数组2025-04-18 07:00:59
  • 匿名内部类的用法2025-04-18 07:00:59
  • jedis和redis的关系2025-04-18 07:00:59
  • 静态方法和实例方法的调用2025-04-18 07:00:59
  • 网页数据加密2025-04-18 07:00:59
  • 动态规划之01背包问题(最易理解的讲解)2025-04-18 07:00:59
  • java并发编程从入门到精通2025-04-18 07:00:59