当我尝试在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之间可能导致这种明显的串扰吗?我该如何防止这种情况?
答案 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