macOS下PyInstaller4.0+版本无法加载自定义*.dylib文件求助
解决方案
1. 改用DYLD_LIBRARY_PATH替代PATH设置
macOS下动态库的搜索依赖DYLD_LIBRARY_PATH环境变量,而非PATH。同时,--windowed模式下sys.argv[0]可能无法正确获取程序路径,改用sys.executable更可靠,修改路径添加代码:
import os import sys dllpath = os.path.dirname(os.path.realpath(sys.executable)) if dllpath not in os.environ.get("DYLD_LIBRARY_PATH", ""): if "DYLD_LIBRARY_PATH" in os.environ: os.environ["DYLD_LIBRARY_PATH"] += os.pathsep + dllpath else: os.environ["DYLD_LIBRARY_PATH"] = dllpath
2. 修正自定义dylib的内部路径(rpath)
macOS动态库依赖内部记录的安装路径,如果是绝对路径会导致打包后无法找到,用install_name_tool修改为相对路径:
# 替换your.dylib为你的动态库文件名 install_name_tool -id "@executable_path/your.dylib" your.dylib
执行后用otool -L your.dylib验证,输出中该dylib的路径应显示为@executable_path/your.dylib。
3. 通过spec文件手动配置打包参数
如果上述方法无效,生成并编辑spec文件来精准控制动态库的加载路径:
- 生成spec文件:
/usr/local/opt/python@3.8/bin/python3.8 -m PyInstaller --add-binary *.dylib:. --clean --windowed --onedir --noupx --name "$AppName" --icon=main.icns main.py --specpath .
- 打开生成的
$AppName.spec文件,在EXE节点添加rpath配置:
EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='$AppName', debug=False, bootloader_ignore_signals=False, strip=False, upx=False, upx_exclude=[], runtime_tmpdir=None, console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, # 添加rpath指向程序所在目录 rpath=[os.path.dirname(os.path.abspath(__file__))] )
- 用spec文件重新打包:
/usr/local/opt/python@3.8/bin/python3.8 -m PyInstaller "$AppName.spec" --clean
4. 验证打包结果
检查dist/$AppName/目录下是否存在你的自定义dylib文件,确保--add-binary *.dylib:.参数正确将文件复制到了目标目录。
内容的提问来源于stack exchange,提问作者Amin Persia
相关产品推荐
相关产品推荐

