赞
踩
如果工程中有动态加载库,要添加两个选项:–hidden-import 和 --add-binary
–hidden-import <动态插件名字>
–add-binary <src;DEST>
src是动态库的路径,DEST是打包后希望存放的路径,中间的分号是在Windows中使用,Linux中用冒号
例如目录结构
|-main.py
|-plugins/
|-plugins/__init__.py
|-plugins/_01plugin.py
|-plugins/_02plugin.py
|-plugins/_98plugin.py
|-plugins/_99plugin.py
命令行
pyinstaller --hidden-import plugin--hidden-import plugins._01plugin --hidden-import plugins._01plugin --hidden-import plugins._02plugin --hidden-import plugins._98plugin --hidden-import plugins._99plugin --add-binary ./plugins/__init__.py;plugins --add-binary ./plugins/_01plugin.py;plugins --add-binary ./plugins/_02plugin.py;plugins --add-binary ./plugins/_98plugin.py;plugins --add-binary ./plugins/_99plugin.py;plugins -F main.py
-F参数是将工程打包成一个exe文件
两个参数都使用之后也可能会报错说找不到动态插件
从pyinstaller打包后的exe的运行机制将,打包得到的exe文件是一个可自解压的程序,它会把这个exe文件中包含的文件打包到一个名为_MEIxxxxxx的临时目录下面,这个目录在系统的临时文件夹下面(Linux下是/tmp),当程序退出时,会自动清空删除这个临时目录_MEIxxxxxx。
最终的exe文件有可能放在认可目录执行,其当前目录下不会有bin目录下面的资源文件,而是被解压到了临时目录下面,所以程序报错找不到相关文件。
解决方法
要在程序中指定资源文件的路径,使得它在非打包模式和打包模式下运行时都能找到相关资源文件。
base_path = getattr(sys, '_METPASS', os.path.dirname(os.path.abspath(__file__)))
pluginspath = os.path.join(base_path, 'plugins')
把资源的相对路径转换为绝对路径。如果找到_MEIPASS路径就以此为资源的基准路径,否则以当前路径为基准路径。
只使用–hidden-import
会报错,还是上面说的exe运行机制,虽然把动态库添加了进来,但是没有添加动态插件的文件资源,在程序中修改了绝对路径也会显示找不到这个文件。
只使用–add-binary
运行时会报错找不到动态插件中用import引入的包。因为使用这个选项只是把文件打入exe中,并没有识别其中的内容
参考:
https://www.yuanrenxue.com/tricks/pyinstaller-spec.html
https://blog.csdn.net/shixinwenwu/article/details/89879608
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。