系统+自制Python与LLDB的混合奇怪

时间:2017-12-05 16:45:19

标签: python macos homebrew lldb

当我尝试在lldb中运行Python解释器时,我看到了:

$ lldb
(lldb) script
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 52, in <module>
    import weakref
  File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/weakref.py", line 14, in <module>
    from _weakref import (
ImportError: cannot import name _remove_dead_weakref
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.

当我检查启动了哪个版本的Python时,Python报告它应该是Homebrew Python(符号链接到这个位置):

>>> sys.executable
'/usr/local/opt/python/bin/python2.7'

但是,要求Python版本返回与默认 system Python安装相关联的版本,例如

>>> sys.version_info
sys.version_info(major=2, minor=7, micro=10, releaselevel='final', serial=0)

而且,为了确认,上面的二进制路径上的Python版本确实不同(注意微版本的差异):

$ /usr/local/opt/python/bin/python2.7 --version
Python 2.7.14

$ /usr/bin/python --version
Python 2.7.10

为了让事情更加混乱,我的自制软件Python安装的_remove_dead_weakref模块中存在名称_weakref ,但不是默认值系统安装:

$ /usr/bin/python -c "import _weakref; print _weakref._remove_dead_weakref"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute '_remove_dead_weakref'

$ /usr/local/opt/python/bin/python2.7 -c "import _weakref; print _weakref._remove_dead_weakref"
<built-in function _remove_dead_weakref>

知道我的Python安装与LLDB之间可能导致这种明显的串扰吗?我该如何防止这种情况?

4 个答案:

答案 0 :(得分:14)

此问题的一个解决方法是使用PATH上的系统Python安装显式启动LLDB,例如

PATH=/usr/bin /usr/bin/lldb

看起来好像LLDB在PATH查询“活动”Python安装;如果您在PATH上安装了Homebrew的Python,那么当LLDB尝试启动Python时,您可能会遇到这种串扰。

答案 1 :(得分:4)

如果我们运行设置为DYLD_PRINT_LIBRARIES=1的lldb,那么我们可以看到它正在从/ System / Library加载Python.framework,然后从Homebrew加载其他Python库:

dyld: loaded: /System/Library/Frameworks/Python.framework/Versions/2.7/Python
...
dyld: loaded: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_locale.so

但是,如果我们告诉DYLD从Homebrew专门加载Python.framework,那么它将起作用:

DYLD_FRAMEWORK_PATH="$(brew --prefix python@2)/Frameworks/" lldb

已在使用brew'd Python 2.7.15的macOS 10.13.6上进行了测试。

答案 2 :(得分:3)

您可以直接运行brew unlink python@2而不是将其卸载。这将从您的PATH中删除Homebrew的Python2.x。许多Homebrew公式都依赖于Homebrew的Python 2.x,因此您可以保留啤酒安装的Python 2.x,同时还可以通过lldb修复错误。

如果您使用Homebrew Bundle管理Homebrew设置,则可以将此行添加到Brewfile

brew "python@2", link: false

答案 3 :(得分:0)

我通过从Homebrew卸载python@2解决了这个问题: https://github.com/flutter/flutter/issues/17803#issuecomment-390980648

UPD:

正如@Olsonist在评论中指出的那样,运行此命令必须解决此问题:brew uninstall --force python@2