web-dev-qa-db-fra.com

Étrange mélange de système + homebrew Python avec LLDB

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?

16
Kevin Ushey

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.

14
Kevin Ushey

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é.

3
rgov

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 

0
maksadbek