pyinstaller中hook文件作用以及编写

之前用pyinstaller知道有这么个东西,但一直没用过,我的项目里,我的spec文件只配置了一些资源文件,也就是在datas=[]里,hiddenimports这个之前看是一些隐藏库或者是动态库,但是我今天遇到一个情况,就是我新加了个生成ppt功能,需要python-pptx包,我装了包之后,打包正常,但是运行时报错,说缺少一个模板,因为用pptx做ppt一般要用默认的模板,我找了一下,这个模板在包里的一个叫templates的文件夹里,但是打包后没有把这个文件夹拷贝过来,其实这个问题,可以直接在datas里加一个目录就行了,但是开始我并不知道是单纯的文件夹没拷过来还是包的代码也没编译,因为有许多包,打包后会在项目目录有个包的文件夹,但是pptx没看到,所以,在一片混沌中我就开始研究怎么把这个文件夹能打包进来,试了hiddenimports,不管用,写了hook-pptx.py,也不管用。

        没办法,我想试试直接拷源码行不行,我拷过来后发现可以,这时总算能有解决办法了,但是我觉得还不完美,因为我事实上还没有找到根本原因,后来就开始研究hook文件,发现一般hook文件,代码很简单,就收集一下子模块,或者data就是资源文件,哎我突然灵光一闪,是不是我这个报错只是缺资源文件,后来我就只把模板拷过来,发现也管用,至此才找到问题根本原因,pptx的代码其实已经编译过来了,只是没有打包资源文件。

        定位到缺资源文件的问题,其实解决就简单了,一种方法是上文提到的在datas那添加一个,另外一个其实就是本文的重点,在hook文件里加,打开已经有的hook文件,以scrapy为例,代码如下

from PyInstaller.utils.hooks import collect_data_files, collect_submodules

datas = collect_data_files('scrapy')
hiddenimports = collect_submodules('scrapy')

有的包有资源文件,有的没有,这个就需要咱们自己看了,如果有资源文件,默认情况下,pyinstaller是不打包的,所以,我们要想让他打包,就需要编写一个hook_模块名.py,里面加

datas = collect_data_files('scrapy')

这句代码,其实跟在spec文件里是一样的效果,两种方法都行,这样pyinstaller就会把资源文件打包进最后的项目目录。

猜你喜欢

转载自blog.csdn.net/zy1620454507/article/details/130620756