首页 > 编程问答 >pyinstaller + pyside6问题:dlopen Shiboken.abi3.so:找不到符号

pyinstaller + pyside6问题:dlopen Shiboken.abi3.so:找不到符号

时间:2024-07-31 04:42:54浏览次数:13  
标签:python macos pyinstaller pyside shiboken2

我有一个基于 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 这个符号。

可能的原因和解决方法:

  1. PySide6 和 shiboken6 版本不匹配: 确保你安装的 PySide6 和 shiboken6 版本兼容。最好使用相同的版本。你可以通过 pip list 查看已安装的版本。

  2. PyInstaller 没有正确打包 shiboken6: 尝试以下方法解决:

  3. 明确指定 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 版本。

  4. 使用 --hidden-import 参数: 在你的 .spec 文件中,将 hiddenimports=['shiboken6'] 更改为 hiddenimports=['shiboken6', 'shiboken6.*'] ,这样可以确保 PyInstaller 打包 shiboken6 的所有子模块。

  5. 使用 --collect-all 参数: 在 PyInstaller 命令中添加 --collect-all=shiboken6 ,强制收集所有 shiboken6 相关的文件。

  6. macOS 系统库冲突: 尝试在新的干净的虚拟环境中重新安装 PySide6 和 shiboken6。

  7. PyInstaller 缓存问题: 删除 PyInstaller 的缓存文件 ( build dist 文件夹) 并重新构建应用程序。

  8. 代码更改导致的问题: 你提到更改一些不重要的代码行也会导致问题。 仔细检查你修改的代码,特别是与 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 版本

标签:python,macos,pyinstaller,pyside,shiboken2
From: 78813557

相关文章

  • python函数:带星号的参数一个接一个
    我想知道为什么定义以下函数被认为是好的。deffoo(*x,y):pass据我所知,现在有调用此函数的方法,因为它总是缺少y的值。(如果我错了,请纠正我。)这有什么我不知道的用处吗?你说得对,在Python中定义一个像deffoo(*x,y):...这样的函数,在试图以常规方......
  • 基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神
        ......
  • 10个append()函数在Python程序开发中的创新应用
    文末赠免费精品编程资料~~在Python编程的世界里,append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素,这一简单的功能却能激发无限的创造力。今天,我们将探讨append()函数在Python程序开发中的10种创新应用,从基本用法到高级技巧,逐步深入。1.构......
  • 全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规
    全网最适合入门的面向对象编程教程:28类和对象的Python实现-Python编程原则、哲学和规范大汇总摘要:本文主要介绍了在使用Python进行面向对象编程时,Python异常处理的原则-“请求谅解,而非许可”,以及软件设计和Python的编程原则,同时介绍了PEP8规范。原文链接:FreakStud......
  • python生成器
    一前言环境:python3.10win10二生成器1关于生成器先看一个例子    定义了一个函数,当我们运行该函数时,并未像普通函数那样执行函数体内的代码    从其中的英文可知,执行函数得到了一个生成器对象,这个生成器对象也叫做generatoriterator(生成器迭代器),generatorit......
  • 生成MySQL-oracle-SQL server数据字典(附Python代码)
    生成数据字典,早年写的,请注意新的版本变化。(1)MySQL元数据SQLUSEinformation_schema;#取出库和表。select  TABLE_SCHEMAAS'数据库名称',  TABLE_NAMEAS'表名',  TABLE_TYPEAS'表类型',  ROW_FORMATAS'行格式',  ENGINEAS'数据库引擎',  TABL......
  • Python - Method Resolution Order (MRO)
    TheorderinwhichPythonsearchesforattributesinbaseclassesiscalledmethodresolutionorder(MRO).Itgivesalinearizedpathforaninheritancestructure.PythoncomputesanMROforeveryclassinthehierarchy;thisMROiscomputedusingthe‘C3......
  • 计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 【自动化测试必学语言】python:语言基础
    目录Python介绍语言的分类注释单行注释多行注释变量定义变量使用变量变量名的命名规范数据类型数字类型非数字类型type()函数input输入print输出格式化输出快捷键(小操作)运算符算术运算符 比较运算符Python介绍作者:吉多·范罗苏姆(Guidov......
  • Python基础知识笔记——常用函数
    一、range()函数range()函数用于生成一个整数序列。它通常用于循环结构中,例如for循环,以提供循环的迭代次数。range()函数可以有1到3个参数。#range(start,stop,step)range(2,6,2)#生成从2开始,到6结束(不包括6),步长为2的一串数字#参数指定不完全时,默认从0开始,步长......