【问题标题】:Can I tell lldb to use a Python other than the first on the PATH?我可以告诉 lldb 使用 PATH 上第一个以外的 Python 吗?
【发布时间】:2026-01-25 15:15:02
【问题描述】:

我正在努力在我的 lldb 会话中添加一些 Python 脚本,但我发现它仅在 /usr/bin/python 是 PATH 上的第一个 Python 时才有效。如果我首先在 PATH 上找到了另一个 Python,那么一旦 lldb 初始化其内部 Python 系统,它将得到如下异常并终止。

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 548, in <module>
    main()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 530, in main
    known_paths = addusersitepackages(known_paths)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 266, in addusersitepackages
    user_site = getusersitepackages()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 241, in getusersitepackages
    user_base = getuserbase() # this will also set USER_BASE
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py", line 231, in getuserbase
    USER_BASE = get_config_var('userbase')
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sysconfig.py", line 516, in get_config_var
    return get_config_vars().get(name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sysconfig.py", line 449, in get_config_vars
    import re
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 105, in <module>
    import sre_compile
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_compile.py", line 14, in <module>
    import sre_parse
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_parse.py", line 17, in <module>
    from sre_constants import *
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_constants.py", line 18, in <module>
    from _sre import MAXREPEAT
ImportError: cannot import name MAXREPEAT

是否有一些 lldb 设置或命令可以让我不理会我的 PATH 但仍然让 lldb 使用/usr/bin/python

我也可以通过设置PYTHONHOME=/usr 来解决这个问题,但由于我正在调试自定义 Python 构建和 Python 扩展,我真的不想改变环境。似乎应该有一些像settings set internal-python /usr/bin/python 这样的方法,我可以在我的~/.lldbinit 中输入来告诉lldb 使用什么。

【问题讨论】:

  • 你可能需要设置你的路径来包含你想要使用的 python 版本的站点包和各种包含......但是我确信它可以完成(我使用 pycharm 和一些项目使用 kivy 及其版本的 python,而其他项目使用我的常规 python 安装,但我运行的是 win7,所以它可能适用于你,也可能不适用于你)(ps wxPython 很棒,我一直在使用它!)
  • 是的,我也可以通过设置 PYTHONHOME 来解决它,但由于我正在调试自定义 Python 构建和 Python 扩展,我真的不想改变环境。我会稍微更新一下问题...

标签: python xcode macos xcode4.6 lldb


【解决方案1】:

LLDB 实际上并不关心 Python 二进制文件本身 然而,它非常关心的是 Python.framework,因为这是调试器所链接的对象

不支持从 OSX 附带的版本更改 Python 版本,因为我们使用 C API(直接和通过 SWIG),并假设某些类/函数/类型将可用(您可以查看源代码以看看假设什么会起作用)。由于我们也使用 SWIG,并不是 Python 所需的一切都在我们的直接控制之下(SWIG 在那里也有发言权),所以除了 OSX 附带的(我们测试过的)以外的任何 Python 场景都可能有效,也可能不会

话虽如此,您也许可以“篡改” Python.framework 以将其指向其他 Python 版本。从那以后,你就靠自己了。

【讨论】:

  • 实际上我正在寻找的是某种方法来告诉 lldb 强制自己使用系统 Python 框架,就像它已经想做的那样。如果我在 PATH 中有一些其他 Python,那么它似乎正在尝试使用该 Python 框架而不是系统框架。如果我更改 PATH 或设置 PYTHONHOME 那么它会再次执行正确的操作,但是如果我从 lldb 中启动已调试的应用程序,我的调试进程看到的环境也会有这些更改。
  • 或者您可以使用 lldb 进程启动命令来设置/取消设置您认为适合您的下级的环境,而不管 lldb 的环境如何。在 LLDB 提示符下启动帮助进程有详细信息
  • 哇,Xcode 用 lldb 替换了 gdb,并没有静态地将它指向唯一可以工作的框架,然后告诉所有用户克服它并修复他们的 python。
  • FWIW,这似乎已在优胜美地修复。您现在可以支持 fink 的 /sw/bin/python 并同时成功运行 lldb。
最近更新 更多