Pyinstaller的Spec⽂件⽤法
Pyinstallerd的应⽤记录
前⾔
当我们⽤py完成⼀些功能,可以通过Pyinstaller将源码打包成exe来独⽴运⾏,⽤户使⽤时只需要执⾏这个exe⽂件即可,不需要在机器上再安装Python及其他包就可运⾏了。(理论上,后⾯会附加⼀些我⾃⼰实际运⽤时遇到的⼀些问题)
Pyinstaller打包⽅式⼀般分为 直接输⼊指令 和 利⽤spec⽂件进⾏打包。由于直接输⼊指令实际就是根据指令⽣成spec⽂件,再根据spec ⽂件的内容进⾏打包操作,所以⼀下重点说明spec⽂件的内容,结尾处附上指令以供参考。
SPEC打包
第⼀步当然是最基础的⽤法,我们先创建⼀个main.py作为启动脚本。在控制台输⼊
pyinstaller [-F/-D] [-w/-c] [-i xxx.ico] main.py
我们可以发现路径下多了main.spec⽂件。后续我们可以修改spec⽂件⾥的内容,然后输⼊指令来进⾏打包操作了
pyinstaller main.spec
后续打包的参数越来越多,每次输⼊⼀⼤堆参数显然不如直接使⽤spec来的⾼效,所以尽量使⽤spec⽂件进⾏打包操作。
SPEC内容说明
下图就是对⼀个main.py进⾏打包时,默认⽣成的spec⽂件,我们来看下每个参数表⽰的含义
变量含义
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⽂件中。
玻璃贴膜品牌block_cipher
加密密钥以上内容中 修改⽐较多的是a、exe的内容,coll和pyz基本没有遇到需要修改的情况。
参数
小天才学习平板含义Analysis参数
scripts
也是第⼀个参数,它是⼀个脚本列表,可以传⼊多个py脚本,效果与命令⾏中指定多py⽂件相同,即py⽂件不⽌⼀个时,⽐如“pyinstaller xxx1.py xxx2.py”,pyinstaller会依次分析并执⾏,并把第⼀个py名称作为spec和dist⽂件下的⽂件夹和程序的名称Analysis参数
pathex 默认有⼀个spec的⽬录,当我们的⼀些模块不在这个路径下,记得把⽤到的模块的路径添加到这个list变量⾥。同命令“-p DIR/–paths DIR”.
Analysis参数
datas 作⽤是将本地⽂件打包时拷贝到⽬标路径下。datas是⼀个元素为元组的列表,每个元组有两个元素,都必须是字符串类型,元组的第⼀个元素为数据⽂件或⽂件夹,元组的第⼆个元素为运⾏时这些⽂件或⽂件夹的位置。例如:datas=[(’./’, ‘./dst’)],表⽰打包时将"./"⽂件添加(copy)
到相对于exe⽬录下的dst⽬录中。也可以使⽤通配符:datas= [ (’/mygame/sfx/*.mp3’,‘sfx’ ) ],表⽰将/mygame/sfx/⽬录下的所有.mp3⽂件都copy到sfx⽂件夹中。也可以添加整个⽂件夹:datas= [
(’/mygame/data’, ‘data’ ) ],表⽰将/mygame/data⽂件夹下所有的⽂件都copy到data⽂件夹下。同命令“–add-data”。
Analysis参数
binaries
添加⼆进制⽂件,也是⼀个列表,定义⽅式与datas参数⼀样。没具体使⽤过。同命令“–add-binary”。
Analysis参数hiddenimports 指定脚本中需要隐式导⼊的模块,⽐如在__import__、imp.find_module()、exec、eval等语句中导⼊的模块,这些模块PyInstaller是不到的,需要⼿动指定导⼊,这个选项可以使⽤多次。同命令“–hidden-import MODULENAME/–hiddenimport
MODULENAME”。
Analysis参数hookspath 指定额外hook⽂件(可以是py⽂件)的查路径,这些⽂件的作⽤是在PyInstaller运⾏时改变⼀些Python或者其他库原有的函数或者变量的执⾏逻辑(并不会改变这些库本⾝的代码),以便能顺利的打包完成,这个选项可以使⽤多次。同命令“–additional-hooks-dir
HOOKSPATH”。
汉语言文学就业方向Analysis参数runtime_hooks 指定⾃定义的运⾏时hook⽂件路径(可以是py⽂件),在打好包的exe程序中,在运⾏这个exe程序时,指定的hook⽂件会在所有代码和模块之前运⾏,包括main⽂件,以满⾜⼀些运⾏环境的特殊要求,这个选项可以使⽤多次。同命令“–runtime-hook
RUNTIME_HOOKS”。
Analysis参数excludes 指定可以被忽略的可选的模块或包,因为某些模块只是PyInstaller根据⾃⾝的逻辑去查的,这些模块对于exe程序本⾝并没有⽤到,但是在⽇志中还是会提⽰“module not found”,这种⽇志可以不⽤管,或者使⽤这个参数选项来指定不⽤导⼊,这个选项可以使⽤多
次。同命令“–exclude-module EXCLUDES”。
exe参数
console
设置是否显⽰命令⾏窗⼝,同命令-w/-c。
exe参数icon设置程序图标,默认spec是没有的,需要⼿动添加,参数值就是图⽚路径的字符串。同命令“命令-i/–icon”。
参数含义
⼀些实际应⽤的问题
怎么清理电脑垃圾关于动态加载的module导⼊问题
有些脚本中,我们使⽤了__import__等⼀些动态导⼊库的函数时,pyinstaller打包是⽆法到这些模块的,在使⽤时就会报"ImportError 不到指定模块",这个时候就需要⼿动导⼊动态加载的模块。
在以下结构中,我们__import__(‘A.AA’)
A
韩国洗发水AA
AAA
AAB
AB
ABA
ABB
直接在spec中声明
在"Analysis参数hiddenimports"中添加需要导⼊模块,hiddenimports=[‘A.AA’]。
通过hook脚本导⼊
1.在spec中,使hiddenimports=[‘A’],
2.名称按照"hooks-xxx.py"的⽅式创建⼀个脚本,此时我们创建⼀个"hooks-A.py", 脚本的主要内容为给"hiddenimports"这个list赋值,可以直接赋值,也可以写逻辑(完全可以看成⼀个py脚本)。
hiddenimports = ['A','A.AA']
3.填写spec中的hookspath参数,值为"hooks-xxx.py"的路径。
完成以上3步,就可以在打包的时候带上动态加载的脚本了。
runtime_hooks参数的使⽤
runtime_hooks参数可以跟hookspath⼀样,指定脚本,当我们运⾏打包的exe时,会在exe执⾏前,先将参数中对应的脚本先执⾏⼀次。可以⽤作创建exe运⾏的⼀些环境。
Pyinstaller库中有⼀些⾃带的runtime_hooks、hookspath脚本,可以去来看以下。
打包后exe⽆法运⾏的问题
管理员权限问题
放C盘就⽆法正常执⾏脚本,这个问题暂时没到答案。就放D盘吧
部分PC⽆法使⽤
其他PC上exe都可以正常运⾏,但是有⼀台就是不⾏,把控制台打开查看打印,报的是ImportError,这肯定不可能。
后来查到exe还需要vc环境,所以就安装了个vc运⾏时库,问题就解决了。
加密问题
上⾯还有个变量block_cipher,主要是防⽌exe被反编译。
block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')
下⾯这边⽂章写的很详细,我也通过这位作者的⽅法成功进⾏了加密。
.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论