2023年11月29日发(作者:)

Python打包exe⽂件⽅法汇总【4种】

Python作为解释型语⾔,发布即公开源码,虽然是提倡开源但是有些时候就是忍不住想打包成exe,不仅仅是为了对代码进⾏加密,⽽是为

了跨平台。防⽌有些没有安装py环境的电脑⽆法运⾏软件。

⽬录对python代码打包成exe的⽅式有4种,py2exepyinstallercx_Freezenuitka,分别对以上4种⽅法介绍,欢迎纠错和提供新的办

法。

py2exe

介绍

py2exe是⼀个将python脚本转换成windows上的可独⽴执⾏的可执⾏程序(*.exe)的⼯具,这样,你就可以不⽤装python⽽在windows系统上

运⾏这个可执⾏程序。

优点:

可以把python打包成exe

缺点:

打包好的 exe只能在相同的系统下运⾏,⽐如你在XP系统⽤py2exe打包好的exe只能在XP上运⾏,在win7上肯定有问题,⽽且也是存在在

别的XP机⼦上也可能不能运⾏,因为⼀些别的机⼦可能会缺少dll⽂件什么的,作者我当时之所以抛弃py2exe 也是因为这个原因;

打包的⽂件也需要打包同exe下的dll,和⼀些库的压缩包,不然exe根本跑不起来

打包时候报始终报RuntimeError: BeginUpdateResource错误,就需要拷贝dll⽂件。C:复制到dist⽬录

总之⽑病⼀⼤堆,基本上已经舍弃了

使⽤

安装好后,准备进⾏打包

准备⼀个⽂件,这个就是想要打包成exe

然后这同⽬录下新建⼀个,内容如下:

#coding=utf-8

from import setup

import py2exe

includes = ["encodings", "encodings.*"]

#要包含的其它库⽂件

options = {"py2exe":

{

"compressed": 1, #压缩

"optimize": 2,

"ascii": 1,

"includes": includes,

"bundle_files": 1 #所有⽂件打包成⼀个exe⽂件

}

}

setup (

options = options,

zipfile=None, #不⽣成⽂件

console=[{"script": "", "icon_resources": [(1, "")] }]#源⽂件,程序图标

)

然后这cmd窗⼝下运⾏:

python py2exe

pyinstaller

PyInstaller除了win32平台外还⽀持Linux,Unix平台.py2exe的⽤法在前⾯的博⽂⾥已经有了,现在看看PyInstaller,pyinstaller是⽬前应⽤最多

python打包⼯具,也是我最常⽤的。

PyInstaller本⾝并不是Python模块,所以安装时随便放在哪⼉都⾏。

优点:

可将python⽂件转成可执⾏⽂件

跨平台

输出的可以是单⼀⽬录,也可以是⼀个单独的打好包的可执⾏⽂件。py2exe貌似输出⽬录。

智能⽀持python的第三⽅模块如PyQt,外部数据⽂件等

⽀持EGG格式⽂件

可执⾏⽂件可以⽤UPX压缩,⼆进制压缩⽅式

⽀持控制台和视窗两种⽅式。

可以选择exe⽂件的图标 (Windows only)

⽀持 COM server (Windows only)

缺点:

import导⼊的问题

pyinstaller是很智能的,只要指定了⼊⼝py⽂件,那么它就会根据代码⾃动查找需要导⼊的包。但是隐式导⼊的话,平常运⾏是没有问题

的,举例:

#

from sqlalchemy import create_engine

from 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 。打包完成后,在当前⽬录下有个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时钟之间来回切换,简单的例⼦就是爬⾍程序爬取⽹页的时

候。假如有10url,我们都要去GET它,实际上⽹络之间的延迟是⼤⼤⾼于计算机内部的,那么这个时间内计算机就切换到下⼀个。

有时候运⽤多进程是必须的,这个替代不了,哪怕它占⽤资源很多。

使⽤

安装:

pip install pyinstaller

使⽤⽅法(例⼦):

pyinstaller -D -p F:Python27Lib -i

-D:打包成多个⽂件

-p:指定python安装包路径

-i:指定图标,我的图标放在同⽬录下

:要打包的⽂件,和图标放在同⽬录下了

-D-F⼀⼀对应,-F是打包成⼀个单独的⽂件。最后⼀排加上–noconsole,就是⽆窗⼝运⾏。

如果py程序是多进程的话,使⽤pyinstaller打包会出现错误,这个时候只要加上⼀⾏代码

在:

if name==‘mian’:

#新增

_support()

即可

有的时候你加上图⽚后打包会出错,这是因为图标⾥⾯的格式出错了,需要⽤图⽚编辑软件重新对图⽚内部⼤⼩进⾏设置,这个百度⼀下吧

~

如果要加密混淆代码(其实没有⽤,⼀样可以反编译出你的源代码,但是聊胜于⽆吧)

加上⼀⾏ --key=asfweakjhfksafkasdkdbas随便⼏个字符串

好像要安装依赖包,根据提⽰安装即可

cx_Freeze

python中⽐较常⽤的pythonexe⽅法有三种,分别是cx_freeze,py2exePyInstallerpy2exe恐怕是三者⾥⾯知名度最⾼的⼀个,但是同

时相对来说它的打包质量恐怕也是最差的⼀个。pyinstaller打包很好,但是操作⼯序较为复杂,推荐cx_freeze,可以通过pip install cx-

freeze 安装。这是别⼈的描述,其实我觉得pyinstaller其实挺简单的

使⽤

安装⽅法:

打开cmd,输⼊pip install cx-freeze 后,会发现在pythonScripts⽂件夹下⽣成了三个⽂件

然后在cmd,切换到Scripts路径下,输⼊ python cxfreeze-postinstall,会发现Scripts⽂件夹下⼜多了.bat⽂件,此时已经安装成功

继续在cmd下尝试输⼊ cxfeeeze -h 验证下,显⽰成功。

提⽰:直接通过 pip install cx-freeze 安装,仍然出现错误时(找不到⽂件),最好去官⽹:⽹址⼿动下载相应版本的cx-freeze⽂件,放在

Scripts⽂件夹下,⼿动双击安装,然后再运⾏cxfreeze-postinstall。(例如:我的python版本是3.4.3,下载cx_-amd64-

py3.4的⽂件。注意,版本不对⽆法安装!)

cxfreeze的安装⽬录下即Python34Scripts,添加⼀个⽂件(可⽤记事本)内容如下:

@ echo off

C: C:Python34Scriptscxfreeze %*

在该⽬录下输⼊czfreeze -h也可以查看安装情况(⽤pip install cxfreeze就可直接安装改第三⽅库)

打包⽅法

打包⽂件时要在Scripts⽂件夹路径下操作,⽂件的路径最好是绝对路径。例如:将 G 盘的 打包到 G 盘的 123⽂件夹下:cxfreeze

g: --taget-dir g:123 或者 cxfreeze g: --taget-dir g:123 --base-name=Win32GUI。加上–base-name=Win32GUI可以在运⾏

exe时去掉cmd⿊框。

具体操作:

⾸先在命令提⽰符中使⽤cd命令转换到所需要转换的python⽂件的⽬录中,因为转换后的dist⽂件夹会出现在命令提⽰符的当前⽬录中

然后输⼊:

cxfreeze --init-script=C:UserstangcDesktopalien_invasionalien_ alien_

--init-script=后接绝对路径

如果你的程序中有图⽚等资源,是需要根据程序中的相对路径加⼊到dist⽂件中,也要在.exe同⽬录中加⼊images的⽂件夹(图⽚资源)

如果原.py程序使⽤了图⽚等素材,并且添加图⽚是相对路径(同⼀个⽂件夹下可以不使⽤绝对路径),打包⽂件后,需要将图⽚等素材拷

贝⼀份放在打包后的⽂件夹下,否则运⾏.exe程序会找不到图⽚素材。

如果原.py程序使⽤图⽚添加的是绝对路径,在本地电脑上运⾏时可能不会发现错误。但是你将打包后的⽂件发给另⼀台机器,运⾏.exe程序

会报错,⼤概意思是根据你写的绝对路径找不到图⽚等素材,即使你在⽂件夹下拷贝了素材,但是绝对路径也是错误的,所以,最好使⽤

上⼀种⽅法。

注意:

只能指定⼀个要打包的模块,也就是启动模块

发布后,可执⾏⽂件执⾏路径不能有中⽂(最好也不要有空格)

启动执⾏的⽂件中不要有下⾯这种判断,否则可执⾏⽂件执⾏会没有任何效果

if __name__=='__mian__':

exe放到其他机⼦上运⾏,弹出找不到,⼿动将”“拷贝到dist⽬录下即可

要去掉exe⾥的后⾯⿊⾊控制台窗⼝就在前⾯的命令改成:

cxfreeze C: (需打包⽂件路径) –target-dir D:pyproject (存放exe的⽬标⽂件夹路径)–base-name=win32gui

nuitka

Nuitka直接将python编译成C++代码 ,再编译C++代码产⽣可执⾏⽂件,完全不存在反向解析的问题,⾮常安全,⽽且由于可执⾏⽂件由C++

译⽽来,运⾏速度也会获得提升。

但是我在打包中发现了⼀个⽂件,那就是在另⼀台电脑上⽆法运⾏并且实际编译时需要近20分钟,编译的时候cpu持续100%

不过如果只是⾃⼰的电脑上运⾏的话,还是挺好使的

注意nuitkapython的某些语法有专门要注意的地⽅

下载完后会提⽰安装编译c++代码的软件,使⽤的是gcc

安装好有会有⼀个MinGW64的⽂件夹,⽐如我要打包⼀个的⽂件,把这个py⽂件放在哪个⽬录下,常⽤命令如下

python -m nuitka --recurse-all --standalone

python -m nuitka --standalone

# 可以⽤的打包⽅式

python -m nuitka --recurse-all --recurse-plugins=F:Python27Lib --remove-output --plugin-enable=enum_compat

# 带图标并且有窗⼝

python -m nuitka --recurse-all --recurse-plugins=F:Python27Lib --remove-output --icon= --plugin-enable=enum_compat

# 不带窗⼝不带图标

python -m nuitka --recurse-all --recurse-plugins=F:Python27Lib --remove-output --plugin-enable=enum_compat --windows-disable-console

# 不删除辅助⽂件夹

python -m nuitka --recurse-all --recurse-plugins=F:Python27Lib --icon= --plugin-enable=enum_compat

# 其他可运⾏

python -m nuitka --recurse-all --recurse-plugins=F:Python27Lib --standalone --remove-output --icon= --plugin-enable=enum_compat

在编译的时候⼤概要挺长时间,并且cpu持续暴涨。