python打包exe带第三方库_Python三方库:PyInstaller(exe程序打包)
python打包exe带第三⽅库_Python三⽅库:PyInstaller(exe
程序打包)
PyInstaller可以将Python程序打包成⼀个exe程序来独⽴运⾏,⽤户使⽤时只需要执⾏这个exe⽂件即可,不需要在机器上再安装Python 及其他包就可运⾏了。另外,PyInstaller相较于其他打包程序,⽐如py2exe,⼤多时候使⽤起来更加⽅便,可以通过命令⾏的⼀些简单命令即可进⾏打包,当然,当你需要打包的程序⽐较⼤且复杂时,使⽤哪个打包程序可能差别都不会太⼤了,这时候就看个⼈的习惯和爱好了。早上空腹喝酸奶
pip安装PyInstaller:pip install pyinstaller
pip更新PyInstaller:pip install --upgrade pyinstaller
注意:windows安装PyInstaller时需要额外安装另外两个模块,pywin32或pypiwin32,以及pefile,如果使⽤pip进⾏安装,但是还没有安装pywin32时,会⾃动安装pypiwin32,pefile没有时也会⾃动安装。
简单打包命令
pyinstaller [-F/-D] [-w/-c] [-i xxx.ico] xxx.py/xxx.spec
xxx.py/xxx.spec:需要打包的程序main⽂件或者spec⽂件。spec⽂件在使⽤py⽂件进⾏打包时会在相同路径下⾃动⽣成,spec中的内容也是根据命令⾏中输⼊的内容来⽣成的,也可以使⽤命令pyi-makespec [options] xxx.py来⽣成⼀个纯粹的spec⽂件,⽽不会去执⾏打包的操作。
-F/--onefile:将整个程序打包为⼀个exe⽂件,需要注意的是,与-D模式⽣成的exe程序相⽐,在启动速度上会慢⼀点,原因是它需要先解压exe⽂件并⽣成⼀个唯⼀的临时环境来运⾏程序,关闭环境时也会⾃动删除这个临时环境,-D模式的程序本⾝就是解压好的,运⾏完也不需要执⾏删除操作,当程序⽐较⼤时,这个差别就很明显了。
-D/--onedir:默认选项,与F/--onefile参数作⽤相反,将程序打包为⼀个⽂件夹,⽂件夹中包含启动程序的exe⽂件和其他依赖的资源⽂件和DLL⽂件等。
-w:表⽰程序运⾏后隐藏命令⾏窗⼝,当你不需要使⽤命令⾏窗⼝作为程序的I/O时,⽐如GUI程序,可以使⽤这个参数选项。
-c:默认选项,与-w相反,提供⼀个命令⾏窗⼝进⾏I/O。
-i/--icon:指定exe程序图标。
⼀般来说,⼤多数的程序,特别是⼀些⼩程序,使⽤这个命令就可以顺利的打包了,也⽤不到其他复
杂的参数选项。如果需要其他的知识点,以下的⼀些点可以参考下(这些点是⾃⼰在官⽅⽂档上的,有些并没有经过验证,有错欢迎指正):儿童餐具
命令⾏指定参数选项⽅式打包:
build⽂件夹:运⾏后会在同路径下⽣成⼀个build⽂件夹,这个⽂件夹的作⽤相当于PyInstaller的⼯作空间,PyInstaller运⾏相关的⽂件和⽇志都在这个⽂件夹中,打包完成后可以直接删除。
dist⽂件夹:运⾏完成后会在同路径下⽣成⼀个dist⽂件夹,这个⽂件夹下有⼀个跟程序同名的⽂件夹,打包好的exe程序就在这个⽂件夹下。
多py⽂件:如果命令⾏中指定的py⽂件不⽌⼀个,⽐如“pyinstaller xxx1.py xxx2.py”,pyinstaller会依次分析并执⾏,并把第⼀个py 名称作为spec和dist⽂件下的⽂件夹和程序的名称。
其他常⽤参数选项:
--specpath DIR:指定⽣成spec⽂件的路径,默认为当前路径。
-n NAME/--name NAME:指定spec⽂件和程序的名称,默认就是传⼊的py脚本或spec⽂件的名称。
-h/--help:显⽰PyInstaller帮助信息。世界领土面积排名前三
-v/--version:显⽰PyInstaller版本信息。
--distpath DIR:指定⽣成dist的⽬录,默认为“./dist”。
--workpath WORKPATH:指定pyinstaller的⼯作⽬录,即build⽂件夹,默认为“./build”。
-y/--noconfirm:替换输出⽬录时不询问,默认输出⽬录是“SPECPATH/dist/SPECNAME”。
--upx-dir UPX_DIR:指定UPX程序的路径,默认为“程序执⾏路径”,即双击某个⽂件时,系统⾃动查对应程序的路径。UPX为⼀个压缩程序,需要⾃⾏下载,可以将exe压缩为zip格式的⽂件,并且压缩效率⾮常⾼,如果打包后的exe程序⾮常⼤的话,为了避免客户下载时⽂件太⼤的问题,可以使⽤这个UPX⼯具。
--noupx:不需要UPX(即便可⽤)。
-a/--ascii:不⽀持Unicode,默认为⽀持(如果可⽤的话)。
--clean:在pyinstaller开始执⾏之前清除缓存并删除临时⽂件(⼀般存储在C:\Users\Administrator\AppData\Roaming\pyinstaller)。
-
-log-level LEVEL:指定打印的⽇志等级,默认为INFO,⽇志等级有:TRACE,DEBUG,INFO,WARN,ERROR,CRITICAL。如果在打包时遇到了问题,为了⽅便定位问题,可以使⽤这个参数来查看特定级别的⽇志信息。
龟兔赛跑故事新编作文400字
数据绑定和搜索相关的参数选项:
--add-data SRC;DEST:指定需要添加⾮⼆进制⽂件路径或者⽂件夹路径,⽐如图⽚和pdf⽂件等,这个选项可以使⽤多次。这个命令其实就是将需要的⽂件或者⽂件夹拷贝到指定的路径下,在-D模式下,可以看情况在程序打包完成后⾃⼰⼿动拷贝过去。
--add-binary SRC;DEST:指定需要添加的⼆进制⽂件路径,⽐如DLL⽂件、动态链接库或者共享⽂件对象等,这个选项可以使⽤多次。同-add-data命令⼀样,是⼀个拷贝数据的功能。
-p DIR/--paths DIR:指定import语句的查路径(与PYTHONPATH⼀样),多个路径之间可以使⽤分号“;”连接,或者多次使⽤这个选项来进⾏指定。
--hidden-import MODULENAME/--hiddenimport MODULENAME:指定脚本中需要隐式导⼊的模块,⽐如在__import__、
imp.find_module()、exec、eval等语句中导⼊的模块,这些模块PyInstaller是不到的,需要⼿动指
定导⼊,这个选项可以使⽤多次。
--additional-hooks-dir HOOKSPATH:指定额外hook⽂件(可以是py⽂件)的查路径,这些⽂件的作⽤是在PyInstaller运⾏时改变⼀些Python或者其他库原有的函数或者变量的执⾏逻辑(并不会改变这些库本⾝的代码),以便能顺利的打包完成,这个选项可以使⽤多次。
--runtime-hook RUNTIME_HOOKS:指定⾃定义的运⾏时hook⽂件路径(可以是py⽂件),在打好包的exe程序中,在运⾏这个exe程序时,指定的hook⽂件会在所有代码和模块之前运⾏,包括main⽂件,以满⾜⼀些运⾏环境的特殊要求,这个选项可以使⽤多次。
--exclude-module EXCLUDES:指定可以被忽略的可选的模块或包,因为某些模块只是PyInstaller根据⾃⾝的逻辑去查的,这些模块对于exe程序本⾝并没有⽤到,但是在⽇志中还是会提⽰“module not found”,这种⽇志可以不⽤管,或者使⽤这个参数选项来指定不⽤导⼊,这个选项可以使⽤多次。
--key KEY:指定⽤于Python字节码加密的key,key是⼀个16个字符的字符串。
-D模式程序的运⾏:运⾏程序的时候,其实开始运⾏的是⼀个pyinstaller⽣成的引导加载程序bootloader,bootloader是根据不同的操作系统⽣成的,运⾏bootloader时,会创建⼀个临时的Python环境以便运⾏Python程序,所以使⽤exe程序时不⽤安装Python也能运⾏这个程序。
-
F模式程序的运⾏:也会有⼀个BootLoader,但是会根据操作系统创建⼀个名为_MEIxxxxxx的⽂件夹,⽤作这个程序的临时运⾏环境(不只是Python环境),这个xxxxxx是⼀个随机的数字。-F模式程序启动的时候因为需要解压并拷贝依赖和资源⽂件到临时运⾏环境
_MEIxxxxxx,所以启动速度是⽐-D模式程序要慢的,运⾏结束后会删除临时运⾏环境的⽂件夹。在Linux和相关系统中,可能有“no-execution”选项,但是对于-F模式程序是不兼容的。由于_MEIxxxxxx是唯⼀的,所以可以同时运⾏多个程序,多个程序时互不⼲涉的。如果程序崩溃了,或者强⾏结束了(⽐如在Windows的任务管理器中杀死了进程),_MEIxxxxxx⽂件夹是不会被删除的,所以频繁崩溃或者结束进程会导致有多个_MEIxxxxxx⽂件夹,会⾮常占⽤磁盘空间,可以使⽤--runtime-temdir指定_MEIxxxxxx的存放位置。-F模式程序如果在运⾏时遇到了权限问题,可以使⽤-D模式程序替代。
shell脚本/批处理脚本:使⽤命令⾏打包时,可能需要指定的参数选项很多,这时候可以将需要执⾏的全部命令信息,包括这些参数选项的指定,都放在⼀个shell脚本或者批处理⽂件中来执⾏。
运⾏时信息:
__file__: 所有基于模块的使⽤到__file__属性的代码,在源码运⾏时表⽰的是当前脚本的绝对路径,但是打包后就是当前模块的模块名(即⽂件名xxx.py)。
sys.frozen:源码运⾏时没有这个属性,打包后的程序添加了这个属性,值为True。
sys._MEIPASS: 源码运⾏时没有这个属性,打包后的程序添加了这个属性,表⽰程序运⾏的绝对路径。对于-D模式程序,表⽰的是这个exe程序所在⽂件夹的绝对路径,对于-F模式程序表⽰的是_MEIxxxxxx的⽂件夹绝对路径,_MEIxxxxxx为exe解压后创建的临时运⾏环境的⽂件夹名称,对于exe程序每⼀次运⾏来说,它是唯⼀的。
鼓励反义词sys.argv[0]:⼀般来说就是运⾏程序的绝对路径,但是在不同平台或者不同的⽅式启动程序时,会有所不同,⽐如通过符号链接运⾏的程序sys.argv[0]就是符号名称,⽽不是真实的程序路径。
数据⽂件的修改:--add-data这种通过拷贝形式的数据⽂件,在-D模式下如果在运⾏时修改了,那么对应的数据⽂件是真的被修改了,但是在-F模式下,由于每次运⾏会单独创建⼀个临时运⾏环境,修改的内容也是临时运⾏环境中的内容,并且运⾏完后会⾃动删除临时运⾏环境,所以这种数据⽂件是⽆法直接更改exe中的数据⽂件的,也就意味着每次运⾏程序,数据⽂件都会是exe程序中原来的那⼀份,修改的内容会随着临时运⾏环境的关闭⽽删除了,不会同步到exe程序中的。
发⽣错误时:
当发⽣“module not found”警告时,其实很多不到对应模块的消息都不⽤管,只是PyInstaller根据⾃⾝的逻辑去查的,因为它们并不是跟你的最终程序有关的。
当发⽣导⼊失败时,这才是真正的错误,需要去关注和解决的。
当打包成功,且中间没有发⽣任何警告提⽰,但是运⾏程序时提⽰某个模块不到,可能就是“--hidden-import=”的问题了,当使⽤
__import__、imp.find_module()、exec、eval或者Python/C API时,pyinstaller不会⾃动去导⼊这些⾥⾯涉及的导包,所以这些包就需要使⽤“--hidden-import=”来指定具体需要导⼊的包了。
--runtime-hook=xxx.py中指定的py会依次在打包的主程序main脚本之前运⾏,可以⽤来改变⼀些函数或者变量,以满⾜特殊场景的要求。
spec配置⽂件⽅式打包
⽣成spec⽂件:pyi-makespec [options] xxx.py [],⽣成spec⽂件时可以什么都不指定,然后在⽣成的spec⽂件中单独配置,默认为-D模式下的spec⽂件,也可以指定⽣成-F模式的spec⽂件。当然也可以在第⼀次就将参数选项指定好,以后就只维护spec⽂件。
参数选项:⽣成spec⽂件的参数选项和命令⾏模式下执⾏PyInstaller打包是完全⼀样的。
spec⽂件类型:spec⽂件其实就是⼀个py⽂件,在编辑时可以直接将它当成⼀个py⽂件来使⽤。
spec⽂件优势:⼀般情况⽽⾔,直接使⽤PyInstaller命令⾏直接打包即可,但是以下情况使⽤spec⽂件的话会⽅便⼀些:
程序需要绑定⼀些数据⽂件,可以在spec⽂件中单独⽤⼀个列表变量来指定,可读性和可维护性会⾼很多。
需要include⼀些PyInstaller不知道的动态链接库,如:.dll/.so⽂件,同样可以在spec⽂件中单独⽤⼀个列表变量来指定。
需要往可执⾏⽂件中添加⼀些运⾏时选项,如hook⽂件。
关于spec⽂件:
如果有需要,可以通过PyCharm、eclipse等⼯具打开安装⽬录中的PyInstaller⽂件夹来查看源码信息a:Analysis类的实例,要求传⼊各种脚本⽤于分析程序的导⼊和依赖。a中内容主要包括以下四部分:scripts,即可以在命令⾏中输⼊的Python脚本;pure,程序代码⽂件中的纯Python模块,包括程序的代码⽂件本⾝;binaries,程序代码⽂件中需要的⾮Python模块,包括--add-binary参数指定的内容;datas,⾮⼆进制⽂件,包括--add-data参数指定的内容。
pyz:PYZ的实例,是⼀个.pyz⽂件,包含了所有pure中的所有Python模块。
exe:EXE类的实例,这个类是⽤来处理Analysis和PYZ的结果的,也是⽤来⽣成最后的exe可执⾏程序。
coll:COLLECT类的实例,⽤于创建输出⽬录。在-F模式下,是没有COLLECT实例的,并且所有的脚本、模块和⼆进制⽂件都包含在了最终⽣成的exe⽂件中。
Analysis参数scripts:也是第⼀个参数,它是⼀个脚本列表,可以传⼊多个py脚本,效果与命令⾏中指定多py⽂件相同,即py⽂件不⽌⼀个时,⽐如“pyinstaller xxx1.py xxx2.py”,pyinstaller会依次分析并执⾏,并把第⼀个py名称作为spec和dist⽂件下的⽂件夹和程序的名称。
Analysis参数pathex:同命令“-p DIR/--paths DIR”,其实默认就有⼀个spec的⽬录,如果使⽤命令添加的话,会⾸先添加命令中指定的⽬录,再添加默认的路径。
Analysis参数datas:即添加数据⽂件,命令是--add-data,spec⽂件中是Analysis的datas=[]参数,datas是⼀个元素为元组的列表,每个元组有两个元素,都必须是字符串类型,元组的第⼀个元素为数据⽂件或⽂件夹,元组的第⼆个元素为运⾏时这些⽂件或⽂件夹的位置。例如:datas=[('', '.'), ],也可以在命令⾏中这样写:pyinstaller --add-data ';.' myscr
ipt.py,表⽰打包时将⽂件添加(copy)到相对于spec⽂件的根⽬录下,指定⽂件时是相对于spec来进⾏寻的,⽽不是要打包的exe程序路径。也可以使⽤通配符:datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) ],表⽰将/mygame/sfx/⽬录下的所有.mp3⽂件都copy到sfx⽂件夹中。也可以添加整个⽂件夹:datas= [ ('/mygame/data', 'data' ) ],表⽰将/mygame/data⽂件夹下所有的⽂件都copy到data⽂件夹下。
Analysis参数binaries:添加⼆进制⽂件,效果同命令--add-binary,也是⼀个列表,定义⽅式与datas参数⼀样。
Analysis参数hiddenimports:同命令“--hidden-import MODULENAME/--hiddenimport MODULENAME”。
Analysis参数hookspath:同命令“--additional-hooks-dir HOOKSPATH”。
Analysis参数runtime_hooks:同命令“--runtime-hook RUNTIME_HOOKS”。
Analysis参数excludes:同命令“--exclude-module EXCLUDES”。
exe参数console:设置是否显⽰命令⾏窗⼝,和命令-w/-c作⽤⼀样。
exe参数icon:设置程序图标,和命令-i/--icon作⽤⼀样。某些情况,直接执⾏“pyinstaller xxx.py”时⽣成的spec中没有这个参数,需要⼿动添加,参数值就是图⽚路径的字符串。
PyInstaller全局变量:这些全局变量可以在spec⽂件使⽤。
DISTPATH:相对于dist⽂件夹的相对路径,如果--distpath参数选项被指定了,则使⽤被指定的参数值。
HOMEPATH:pyinstaller查的绝对路径,⼀般是Python解释器的site-packages⽂件夹的绝对路径。
SPEC:在命令⾏中指定的spec⽂件路径。
SPECPATH:os.path.split(SPEC)的第⼀个值。
specnm:spec⽂件的⽂件名,不含⽂件类型后缀。
反倾销什么意思workpath:相对于build⽂件夹的相对路径,如果workpath=参数选项被指定了,这使⽤被指定的值。
WARNFILE:在build⽂件夹中警告⽂件的全路径,⼀般是
指定了相同的参数:当命令⾏和spec中指定了相同的参数选项,那么命令⾏的参数选项会被忽略。
遇到的问题和解决⽅案:
1.问题描述:
打包时报如下异常:
File "c:\python36\lib\site-packages\PyInstaller\hooks\pre_safe_import_ves.py", line 34, in pre_safe_import_module
for real_module_name, six_module_name in real_to_six_module_name.items():
AttributeError: 'str' object has no attribute 'items'
解决⽅案:
使⽤命令“pip install --upgrade setuptools”更新三⽅库setuptools

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