1、Python 打包 exe 文件方法汇总 Python 作为解释型语言,发布即公开源码,虽然是提倡开源但是有些时候就是忍不住想打包成 exe,不仅仅是为了对代码进行加密,而是为了跨平台。防止有些没有安装 py 环境的电脑无法运行软件。目录对 python 代码打包成 exe 的方式有 4 种,py2exe,pyinstaller ,cx_Freeze,nuitka,分别对以上 4 种方法介绍,欢迎纠错和提供新的办法。py2exe介绍py2exe 是一个将 python 脚本转换成 windows 上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装 python 而在 wind
2、ows 系统上运行这个可执行程序。优点:可以把 python 打包成 exe缺点:打包好的 exe 只能在相同的系统下运行,比如你在 XP 系统用 py2exe 打包好的 exe 只能在 XP 上运行,在 win7 上肯定有问题,而且也是存在在别的 XP机子上也可能不能运行,因为一些别的机子可能会缺少 dll 文件什么的,作者我当时之所以抛弃 py2exe 也是因为这个原因;打包的文件也需要打包同 exe 下的 dll,和一些库的压缩包,不然 exe 根本跑不起来打包时候报始终报 RuntimeError: BeginUpdateResource 错误,就需要拷贝 dll 文件。C:WINDO
3、WSsystem32python27.dll 复制到 dist 目录总之毛病一大堆,基本上已经舍弃了使用下载地址安装好后,准备进行打包准备一个文件 x.py,这个 x.py 就是想要打包成 exe。然后这 x.py 同目录下新建一个 setup.py,内容如下:#coding=utf-8from distutils.core import setupimport py2exeincludes = “encodings“, “encodings.*“#要包含的其它库文件options = “py2exe“:“compressed“: 1, #压缩“optimize“: 2,“ascii“: 1,
4、“includes“: includes,“bundle_files“: 1 #所有文件打包成一个 exe 文件setup (options = options,zipfile=None, #不生成 library.zip 文件console=“script“: “x.py“, “icon_resources“: (1, “Q.ico“) #源文件,程序图标)然后这 cmd 窗口下运行:python setup.py py2exepy2exe 使用方法 (含一些调试技巧,如压缩 email 类)pyinstallerPyInstaller 除了 win32 平台外还支持 Linux,Unix
5、平台.py2exe 的用法在前面的博文里已经有了,现在看看 PyInstaller,pyinstaller 是目前应用最多的python 打包工具,也是我最常用的。PyInstaller 本身并不是 Python 模块,所以安装时随便放在哪儿都行。优点:可将 python 文件转成可执行文件跨平台输出的可以是单一目录,也可以是一个单独的打好包的可执行文件。py2exe貌似输出目录。智能支持 python 的第三方模块如 PyQt,外部数据文件等支持 EGG 格式文件可执行文件可以用 UPX 压缩,二进制压缩方式支持控制台和视窗两种方式。可以选择 exe 文件的图标 (Windows only)
6、支持 COM server (Windows only)缺点:import 导入的问题pyinstaller 是很智能的,只要指定了入口 py 文件,那么它就会根据代码自动查找需要导入的包。但是隐式导入的话,平常运行是没有问题的,举例:# test1.pyfrom sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerDB_CONNECT_STRING = mysql+pymysql:/root:123456localhost/studyengine = create_engine(DB_CONNECT_ST
7、RING, 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这是怎么回事呢?那么
8、问题来了,sqlalchemy 这个库在初始化的时候是不需要显示导入引擎库的,它自己有一个 create_engine()的函数来初始化,这个字符串是使用者根据规则来自己填写的。其实解决的方法很简单,我们只要在显式导入 pymysql 这个库即可。现在我们导入这个库:import pymysql1重新打包一遍(重新打包的时候记得删除掉 spec 文件,否则会有缓存,或者是加上clean 选项清除掉),再次运行,现在就没有这个问题了。多进程打包的问题官方的 CPython 存在一个 GIL 锁,这个锁的存在有很多优点,很多库都是线程安全的,单线程执行的效率也高。在 python 早期的一个版本中
9、取消掉了GIL,代之以高粒度的锁来实现多线程,但是实际应用中单个线程的效率大大降低。故后来又将 GIL 这个锁还原回去,所以至今的 python2 也好还是 python3中都会有这个锁。但是这个锁有很大一个问题,那就是效率问题,它导致了python 仅仅只能利用一个 core 来进行数据的计算。所以后面为了弥补这个 GIL带来的问题,专家们设计了 multiprocessing 库,gevent 库等。前一个是多进程库,为了解决 python 用于数据密集型处理的情况;后一个用于异步 IO 处理的情况,基本原理就是在 CPU 时钟之间来回切换,简单的例子就是爬虫程序爬取网页的时候。假如有 1
10、0 个 url,我们都要去 GET 它,实际上网络之间的延迟是大大高于计算机内部的,那么这个时间内计算机就切换到下一个。有时候运用多进程是必须的,这个替代不了,哪怕它占用资源很多。使用安装:pip install pyinstaller1使用方法(例子):pyinstaller -D -p F:Python27Lib -i logo.ico mian.py1-D:打包成多个文件-p:指定 python 安装包路径-i:指定图标,我的图标放在同目录下mian.py:要打包的文件,和图标放在同目录下了-D 与-F 一一对应,-F 是打包成一个单独的文件。最后一排加上 noconsole,就是无窗口
11、运行。如果 py 程序是多进程的话,使用 pyinstaller 打包会出现错误,这个时候只要加上一行代码在:if name=mian:#新增multiprocessing.freeze_support()即可有的时候你加上图片后打包会出错,这是因为图标里面的格式出错了,需要用图片编辑软件重新对图片内部大小进行设置,这个百度一下吧如果要加密混淆代码(其实没有用,一样可以反编译出你的源代码,但是聊胜于无吧)加上一行 -key=asfweakjhfksafkasdkdbas 随便几个字符串好像要安装依赖包,根据提示安装即可cx_Freezepython 中比较常用的 python 转 exe 方法
12、有三种,分别是cx_freeze,py2exe,PyInstaller 。py2exe 恐怕是三者里面知名度最高的一个,但是同时相对来说它的打包质量恐怕也是最差的一个。pyinstaller 打包很好,但是操作工序较为复杂,推荐 cx_freeze,可以通过 pip install cx-freeze 安装。这是别人的描述,其实我觉得 pyinstaller 其实挺简单的使用安装方法:打开 cmd,输入 pip install cx-freeze 后,会发现在 python 的 Scripts 文件夹下生成了三个文件然后在 cmd 中 ,切换到 Scripts 路径下,输入 python cx
13、freeze-postinstall,会发现 Scripts 文件夹下又多了.bat 文件,此时已经安装成功继续在 cmd 下尝试输入 cxfeeeze -h 验证下,显示成功。提示:直接通过 pip install cx-freeze 安装,仍然出现错误时(找不到文件),最好去官网:网址手动下载相应版本的 cx-freeze 文件,放在 Scripts 文件夹下,手动双击安装,然后再运行 cxfreeze-postinstall。(例如:我的python 版本是 3.4.3,下载 cx_Freeze-4.3.3.win-amd64-py3.4 的文件。注意,版本不对无法安装!)在 cxfre
14、eze 的安装目录下即Python34Scripts,添加一个文件cxfreeze.bat(可用记事本)cxfreeze.bat 内容如下: echo offC:Python34python.exe C:Python34Scriptscxfreeze %*12在该目录下输入 czfreeze -h 也可以查看安装情况(用 pip install cxfreeze就可直接安装改第三方库)打包方法打包文件时要在 Scripts 文件夹路径下操作,文件的路径最好是绝对路径。例如:将 G 盘的 hello.py 打包到 G 盘的 123 文件夹下:cxfreeze g:hello.py -taget-
15、dir g:123 或者 cxfreeze g:hello.py -taget-dir g:123 -base-name=Win32GUI。加上 base-name=Win32GUI 可以在运行 exe 时去掉 cmd 黑框。具体操作:首先在命令提示符中使用 cd 命令转换到所需要转换的 python 文件的目录中,因为转换后的 dist 文件夹会出现在命令提示符的当前目录中然后输入:cxfreeze -init-script=C:UserstangcDesktopalien_invasionalien_invasion.py alien_invasion.py-init-script=后接绝
16、对路径如果你的程序中有图片等资源,是需要根据程序中的相对路径加入到 dist文件中,也要在.exe 同目录中加入 images 的文件夹(图片资源)如果原.py 程序使用了图片等素材,并且添加图片是相对路径(同一个文件夹下可以不使用绝对路径),打包文件后,需要将图片等素材拷贝一份放在打包后的文件夹下,否则运行.exe 程序会找不到图片素材。如果原.py 程序使用图片添加的是绝对路径,在本地电脑上运行时可能不会发现错误。但是你将打包后的文件发给另一台机器,运行.exe 程序会报错,大概意思是“根据你写的绝对路径找不到图片等素材”,即使你在文件夹下拷贝了素材,但是绝对路径也是错误的,所以,最好使用
17、上一种方法。注意:只能指定一个要打包的模块,也就是启动模块发布后,可执行文件执行路径不能有中文(最好也不要有空格)启动执行的文件中不要有下面这种判断,否则可执行文件执行会没有任何效果if _name_=_mian_:1将 exe 放到其他机子上运行,弹出“找不到 msvcr100.dll“ ,手动将”msvcr100.dll“拷贝到 dist 目录下即可要去掉 exe 里的后面黑色控制台窗口就在前面的命令改成:cxfreeze C:UsersrestartRemote.py (需打包文件路径) target-dir D:pyproject (存放 exe 的目标文件夹路径)base-name=
18、win32guinuitkaNuitka 直接将 python 编译成 C+代码 ,再编译 C+代码产生可执行文件,完全不存在反向解析的问题,非常安全,而且由于可执行文件由 C+编译而来,运行速度也会获得提升。但是我在打包中发现了一个文件,那就是在另一台电脑上无法运行并且实际编译时需要近 20 分钟,编译的时候 cpu 持续 100%不过如果只是自己的电脑上运行的话,还是挺好使的官方文档注意 nuitka 对 python 的某些语法有专门要注意的地方下载地址下载完后会提示安装编译 c+代码的软件,使用的是 gcc安装好有会有一个 MinGW64 的文件夹,比如我要打包一个 back.py 的
19、文件,把这个 py 文件放在哪个目录下,常用命令如下python -m nuitka -recurse-all -standalone cc.pypython -m nuitka -standalone back.py# 可以用的打包方式python -m nuitka -recurse-all -recurse-plugins=F:Python27Lib -remove-output -plugin-enable=enum_compat back.py# 带图标并且有窗口python -m nuitka -recurse-all -recurse-plugins=F:Python27Lib
20、-remove-output -icon=logo.ico -plugin-enable=enum_compat back.py# 不带窗口不带图标python -m nuitka -recurse-all -recurse-plugins=F:Python27Lib -remove-output -plugin-enable=enum_compat -windows-disable-console back.py# 不删除辅助文件夹python -m nuitka -recurse-all -recurse-plugins=F:Python27Lib -icon=logo.ico -plug
21、in-enable=enum_compat back.py# 其他可运行python -m nuitka -recurse-all -recurse-plugins=F:Python27Lib -standalone -remove-output -icon=logo.ico -plugin-enable=enum_compat back.py在编译的时候大概要挺长时间,并且 cpu 持续暴涨。速度感觉确实变快了点代码混淆你可以自己写混淆器,虽然说是防君子不防小人,但是罢了不提了我使用的是一个在线的代码混淆器,猜测代码会上传到那个服务器上面,所以用或不用看你的需求了地址注意:代码规范符合 python3- 原文:https:/