Python打包exe文件方法汇总【4种】
雨伞什么牌子好Python打包exe⽂件⽅法汇总【4种】
Python作为解释型语⾔,发布即公开源码,虽然是提倡开源但是有些时候就是忍不住想打包成exe,不仅仅是为了对代码进⾏加密,⽽是为了跨平台。防⽌有些没有安装py环境的电脑⽆法运⾏软件。
⽬录对python代码打包成exe的⽅式有4种,py2exe,pyinstaller,cx_Freeze,nuitka,分别对以上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:\WINDOWS\system32\python27.dll复制到dist⽬录
总之⽑病⼀⼤堆,基本上已经舍弃了
使⽤
安装好后,准备进⾏打包
准备⼀个⽂件x.py,这个x.py就是想要打包成exe。
然后这x.py同⽬录下新建⼀个setup.py,内容如下:
#coding=utf-8
长沙保卫战剧情介绍 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, #不⽣成library.zip⽂件
console=[{"script": "x.py", "icon_resources": [(1, "Q.ico")] }]#源⽂件,程序图标
)
然后这cmd窗⼝下运⾏:
python setup.py 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⽂件,那么它就会根据代码⾃动查需要导⼊的包。但是隐式导⼊的话,平常运⾏是没有问题的,举例:
# test1.py
from sqlalchemy import create_engine
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它,实际上⽹络之间的延迟是⼤⼤⾼于计算机内部的,那么这个时间内计算机就切换到下⼀个。
有时候运⽤多进程是必须的,这个替代不了,哪怕它占⽤资源很多。
使⽤
安装:
pip install pyinstaller
使⽤⽅法(例⼦):
pyinstaller -D -p F:\Python27\Lib -i logo.ico mian.py
历史上的大地震-D:打包成多个⽂件催熟香蕉
-p:指定python安装包路径
-i:指定图标,我的图标放在同⽬录下
mian.py:要打包的⽂件,和图标放在同⽬录下了
-D与-F⼀⼀对应,-F是打包成⼀个单独的⽂件。最后⼀排加上–noconsole,就是⽆窗⼝运⾏。
如果py程序是多进程的话,使⽤pyinstaller打包会出现错误,这个时候只要加上⼀⾏代码
在:
if name==‘mian’:
#新增
multiprocessing.freeze_support()
即可
有的时候你加上图⽚后打包会出错,这是因为图标⾥⾯的格式出错了,需要⽤图⽚编辑软件重新对图⽚内部⼤⼩进⾏设置,这个百度⼀下吧~
如果要加密混淆代码(其实没有⽤,⼀样可以反编译出你的源代码,但是聊胜于⽆吧)
加上⼀⾏ --key=asfweakjhfksafkasdkdbas随便⼏个字符串
好像要安装依赖包,根据提⽰安装即可
cx_Freeze
python中⽐较常⽤的python转exe⽅法有三种,分别是cx_freeze,py2exe,PyInstaller。py2exe恐怕是三者⾥⾯知名度最⾼的⼀个,但是同时相对来说它的打包质量恐怕也是最差的⼀个。pyinstaller打包很好,但是操作⼯序较为复杂,推荐cx_freeze,可以通过pip install cx-freeze 安装。–这是别⼈的描述,其实我觉得pyinstaller其实挺简单的
使⽤
安装⽅法:
打开cmd,输⼊pip install cx-freeze 后,会发现在python的Scripts⽂件夹下⽣成了三个⽂件
然后在cmd中,切换到Scripts路径下,输⼊ python cxfreeze-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的⽂件。注意,版本不对⽆法安装!)
在cxfreeze的安装⽬录下即\Python34\Scripts,添加⼀个⽂件cxfreeze.bat(可⽤记事本)cxfreeze.bat内容如下:
@ echo off
C:\ C:\Python34\Scripts\cxfreeze %*
在该⽬录下输⼊czfreeze -h也可以查看安装情况(⽤pip install cxfreeze就可直接安装改第三⽅库)
打包⽅法
打包⽂件时要在Scripts⽂件夹路径下操作,⽂件的路径最好是绝对路径。例如:将 G 盘的 hello.py 打包到 G 盘的 123⽂件夹下:cxfreeze g:\hello.py --taget-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:\Users\tangc\Desktop\alien_invasion\alien_invasion.py alien_invasion.py
--init-script=后接绝对路径
如果你的程序中有图⽚等资源,是需要根据程序中的相对路径加⼊到dist⽂件中,也要在.exe同⽬录中加⼊images的⽂件夹(图⽚资源)
如果原.py程序使⽤了图⽚等素材,并且添加图⽚是相对路径(同⼀个⽂件夹下可以不使⽤绝对路径),打包⽂件后,需要将图⽚等素材拷贝⼀份放在打包后的⽂件夹下,否则运⾏.exe程序会不到图⽚素材。
如果原.py程序使⽤图⽚添加的是绝对路径,在本地电脑上运⾏时可能不会发现错误。但是你将打包后的⽂件发给另⼀台机器,运⾏.exe程序会报错,⼤概意思是“根据你写的绝对路径不到图⽚等素材”,即使你在⽂件夹下拷贝了素材,但是绝对路径也是错误的,所以,最好使⽤上⼀种⽅法。
注意:
只能指定⼀个要打包的模块,也就是启动模块
发布后,可执⾏⽂件执⾏路径不能有中⽂(最好也不要有空格)
启动执⾏的⽂件中不要有下⾯这种判断,否则可执⾏⽂件执⾏会没有任何效果
if __name__=='__mian__':
将exe放到其他机⼦上运⾏,弹出“不到msvcr100.dll“ ,⼿动将”msvcr100.dll“拷贝到dist⽬录下即可
要去掉exe⾥的后⾯⿊⾊控制台窗⼝就在前⾯的命令改成:
cxfreeze C:\Users\restartRemote.py (需打包⽂件路径) –target-dir D:\pyproject (存放exe的⽬标⽂件夹路径)–base-name=win32gui
nuitka
Nuitka直接将python编译成C++代码 ,再编译C++代码产⽣可执⾏⽂件,完全不存在反向解析的问题,⾮常安全,⽽且由于可执⾏⽂件由C++编译⽽来,运⾏速度也会获得提升。
但是我在打包中发现了⼀个⽂件,那就是在另⼀台电脑上⽆法运⾏…并且实际编译时需要近20分钟,编译的时候cpu持续100%
不过如果只是⾃⼰的电脑上运⾏的话,还是挺好使的
注意nuitka对python的某些语法有专门要注意的地⽅
下载完后会提⽰安装编译c++代码的软件,使⽤的是gcc
安装好有会有⼀个MinGW64的⽂件夹,⽐如我要打包⼀个back.py的⽂件,把这个py⽂件放在哪个⽬录下,常⽤命令如下
python -m nuitka --recurse-all --standalone cc.py
python -m nuitka --standalone back.py
# 可以⽤的打包⽅式
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --remove-output --plugin-enable=enum_compat back.py
# 带图标并且有窗⼝
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --remove-output --icon=logo.ico --plugin-enable=enum_compat back.py
# 不带窗⼝不带图标
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --remove-output --plugin-enable=enum_compat --windows-disable-console back.py非主流情侣网名超拽
# 不删除辅助⽂件夹
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --icon=logo.ico --plugin-enable=enum_compat back.py
# 其他可运⾏
python -m nuitka --recurse-all --recurse-plugins=F:\Python27\Lib --standalone --remove-output --icon=logo.ico --plugin-enable=enum_compat back.py
在编译的时候⼤概要挺长时间,并且cpu持续暴涨。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。