Lorsque j'essaie d'exécuter l'interpréteur Python dans lldb
, je vois:
$ 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.
Lorsque j'examine quelle version de Python a été lancée, Python indique qu'il devrait s'agir du Python Homebrew (qui est lié symboliquement à cet emplacement):
>>> sys.executable
'/usr/local/opt/python/bin/python2.7'
Cependant, demander à la version Python renvoie la version associée à l’installation par défaut de system Python, par exemple.
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=10, releaselevel='final', serial=0)
Et, juste pour confirmer, la version Python au chemin binaire ci-dessus est en effet différente (notez la différence dans la version micro):
$ /usr/local/opt/python/bin/python2.7 --version
Python 2.7.14
$ /usr/bin/python --version
Python 2.7.10
Pour rendre les choses plus confuses, le nom _remove_dead_weakref
existe existe dans le module _weakref
pour mon installation Homebrew Python, mais pas l’installation système par défaut:
$ /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>
Avez-vous une idée de ce qui pourrait être à l'origine de cet apparent dialogue croisé entre mes installations Python avec LLDB? Comment puis-je empêcher cela?
Une solution à ce problème consiste à lancer explicitement LLDB avec uniquement l'installation Python du système sur PATH, par exemple.
PATH=/usr/bin /usr/bin/lldb
Il semble que LLDB interroge la PATH
pour l'installation Python 'active'; Si vous avez une installation Homebrew de Python disponible sur la PATH
, vous pouvez vous heurter à ce type de dialogue lorsque LLDB tente de lancer Python.
Si nous exécutons lldb avec DYLD_PRINT_LIBRARIES=1
set, alors nous pouvons voir qu'il charge le fichier Python.framework à partir de/System/Library, mais également d'autres bibliothèques Python à partir de Homebrew:
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
Mais si nous demandons à DYLD de charger spécifiquement Python.framework à partir de Homebrew, alors cela fonctionne:
DYLD_FRAMEWORK_PATH="$(brew --prefix python@2)/Frameworks/" lldb
Testé sur macOS 10.13.6 avec Python 2.7.15 brassé.
J'ai résolu ce problème en désinstallant python@2
de Homebrew: https://github.com/flutter/flutter/issues/17803#issuecomment-390980648
UPD:
Comme @Olsonist l'a noté dans les commentaires, l'exécution de cette commande doit résoudre ce problème: brew uninstall --force python@2