PyInstaller指定--specpath时能否给--icon、--add-data设置相对脚本的路径
PyInstaller 4.7版本的默认规则为:指定--specpath参数后,所有传入的相对路径参数(包含--icon、--add-data、--add-binary等)的基准参考目录会自动切换为你设置的specpath目录,而非脚本运行的工作目录,这是触发文件找不到报错的核心原因。
有两种可行的解决方法:
方法1:统一使用绝对路径(最稳妥)
利用Python内置方法获取当前脚本的绝对根目录,所有资源路径都基于这个根目录拼接,完全规避相对路径的基准歧义问题,修改后的代码参考如下:
import sys, os import PyInstaller.__main__ # 先获取当前脚本所在目录的绝对路径 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) args = [ # 这里补充你的其他打包参数、入口脚本路径 '--icon', os.path.join(BASE_DIR, 'myicon.ico'), '--add-data', f"{os.path.join(BASE_DIR, 'resource')};resource", '--workpath', os.path.join(BASE_DIR, 'build'), '--specpath', os.path.join(BASE_DIR, 'build'), '--distpath', os.path.join(BASE_DIR, 'bin'), ] os.chdir(BASE_DIR) PyInstaller.__main__.run(args)
该方案不需要调整--specpath配置,后续即使修改specpath、workpath等参数的取值,也不需要同步调整资源路径,维护成本最低。
方法2:调整相对路径的层级
如果不想使用绝对路径,也可以把所有资源的相对路径调整为相对于specpath目录的路径,比如你指定的specpath为./build,那么原来的./myicon.ico需要改为../myicon.ico,./resource需要改为../resource,不需要修改其他逻辑即可正常打包。缺点是后续如果修改specpath的取值,需要同步调整所有资源的相对路径层级。
内容的提问来源于stack exchange,提问作者Eby
相关产品推荐
相关产品推荐

