我有一个基于 PySide6 的应用程序,使用 pyinstaller 创建的 macOS 二进制文件。
运行构建的应用程序时遇到一个奇怪的问题 - 有时构建很好,应用程序启动时没有任何问题。
但是然后我更改了一些不重要的代码行,重建了应用程序 - 并且构建已损坏。
当我执行二进制文件时,我收到以下消息:
PySide6/__init__.py: Unable to import Shiboken from /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/base_library.zip, /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/lib-dynload, /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks
PySide6/__init__.py: Unable to import Shiboken from /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/base_library.zip, /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/lib-dynload, /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks
Traceback (most recent call last):
File "main.py", line 9, in <module>
File "PyInstaller/loader/pyimod02_importers.py", line 419, in exec_module
File "gui.py", line 4, in <module>
File "PyInstaller/loader/pyimod02_importers.py", line 419, in exec_module
File "PySide6/__init__.py", line 124, in <module>
File "PySide6/__init__.py", line 64, in _setupQtDirectories
File "PyInstaller/loader/pyimod02_importers.py", line 419, in exec_module
File "shiboken6/__init__.py", line 27, in <module>
ImportError: dlopen(/Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/shiboken6/Shiboken.abi3.so, 0x0002): Symbol not found: __ZN8Shiboken14BindingManager14dumpWrapperMapEv
Referenced from: <B31AD3C0-E93A-3A53-BC28-ABA64B3F119C> /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/shiboken6/Shiboken.abi3.so
Expected in: <3D177653-B9D2-3FF2-A8CB-A4BBADC6B7B6> /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/libshiboken6.abi3.6.7.dylib
[51645] Failed to execute script 'main' due to unhandled exception: dlopen(/Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/shiboken6/Shiboken.abi3.so, 0x0002): Symbol not found: __ZN8Shiboken14BindingManager14dumpWrapperMapEv
Referenced from: <B31AD3C0-E93A-3A53-BC28-ABA64B3F119C> /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/shiboken6/Shiboken.abi3.so
Expected in: <3D177653-B9D2-3FF2-A8CB-A4BBADC6B7B6> /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/libshiboken6.abi3.6.7.dylib
[51645] Traceback:
Traceback (most recent call last):
File "main.py", line 9, in <module>
File "PyInstaller/loader/pyimod02_importers.py", line 419, in exec_module
File "gui.py", line 4, in <module>
File "PyInstaller/loader/pyimod02_importers.py", line 419, in exec_module
File "PySide6/__init__.py", line 124, in <module>
File "PySide6/__init__.py", line 64, in _setupQtDirectories
File "PyInstaller/loader/pyimod02_importers.py", line 419, in exec_module
File "shiboken6/__init__.py", line 27, in <module>
ImportError: dlopen(/Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/shiboken6/Shiboken.abi3.so, 0x0002): Symbol not found: __ZN8Shiboken14BindingManager14dumpWrapperMapEv
Referenced from: <B31AD3C0-E93A-3A53-BC28-ABA64B3F119C> /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/shiboken6/Shiboken.abi3.so
Expected in: <3D177653-B9D2-3FF2-A8CB-A4BBADC6B7B6> /Users/rafal/Developer/family-rules-client/dist/Family Rules.app/Contents/Frameworks/libshiboken6.abi3.6.7.dylib
一些附加信息:
- 我正在使用 python 3.12 .4,使用 pyenv 安装,尽管在 3.10.6 上也出现了同样的问题
- 我使用的是新的 venv,只安装了三个软件包:PySide6、pyinstaller、requests(未指定版本==最新)
- 我的规格文件如下:
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['src/main.py'],
pathex=['src/'],
binaries=[],
datas=[
('src/resources', 'resources')
],
hiddenimports=['shiboken6'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='Family Rules',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='Family Rules',
)
app = BUNDLE(
coll,
name='Family Rules.app',
icon='src/resources/icon.icns',
bundle_identifier=None,
info_plist={
'LSUIElement': True,
'LSBackgroundOnly': False,
'NSUIElement': True
}
)
这个错误信息表明,在打包的应用程序中,
Shiboken.abi3.so
找不到
__ZN8Shiboken14BindingManager14dumpWrapperMapEv
这个符号。
可能的原因和解决方法:
-
PySide6 和 shiboken6 版本不匹配: 确保你安装的 PySide6 和 shiboken6 版本兼容。最好使用相同的版本。你可以通过
pip list
查看已安装的版本。 -
PyInstaller 没有正确打包 shiboken6: 尝试以下方法解决:
-
明确指定 shiboken6 库路径: 使用
--paths
参数将 shiboken6 库路径添加到 PyInstaller 命令中。例如:pyinstaller --paths="/path/to/your/venv/lib/python3.x/site-packages/shiboken6" your_script.py
将/path/to/your/venv/
替换为你的虚拟环境路径,并将python3.x
替换为你的 Python 版本。 -
使用
--hidden-import
参数: 在你的.spec
文件中,将hiddenimports=['shiboken6']
更改为hiddenimports=['shiboken6', 'shiboken6.*']
,这样可以确保 PyInstaller 打包 shiboken6 的所有子模块。 -
使用
--collect-all
参数: 在 PyInstaller 命令中添加--collect-all=shiboken6
,强制收集所有 shiboken6 相关的文件。 -
macOS 系统库冲突: 尝试在新的干净的虚拟环境中重新安装 PySide6 和 shiboken6。
-
PyInstaller 缓存问题: 删除 PyInstaller 的缓存文件 (
build
和dist
文件夹) 并重新构建应用程序。 -
代码更改导致的问题: 你提到更改一些不重要的代码行也会导致问题。 仔细检查你修改的代码,特别是与 PySide6 相关的部分,看是否引入了新的依赖或不兼容性。
调试建议:
-
使用
pyinstaller --log-level=DEBUG your_script.py
运行 PyInstaller,查看详细的日志信息,以便更好地了解打包过程和潜在问题。 -
使用
otool -L YourApp.app/Contents/Frameworks/shiboken6/Shiboken.abi3.so
查看Shiboken.abi3.so
依赖的库,确保这些库存在且路径正确。
请尝试以上方法,如果问题仍然存在,请提供更多信息,例如:
- 完整的错误日志
- 你的 PySide6 和 shiboken6 版本
- 你使用的 PyInstaller 版本
- 你的 macOS 版本