web-dev-qa-db-ja.com

システム+ homebrewの奇妙な混合Pythonと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バージョンを要求すると、デフォルトに関連付けられているバージョンが返されますシステム 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

わかりにくくするために、名前_remove_dead_weakrefdoes_weakref私のHomebrewのモジュールPythonインストール、ただしnotデフォルトのシステムインストール:

$ /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インストールと、これを防ぐにはどうすればよいですか?

20
Kevin Ushey

この問題の回避策の1つは、システム上でのみLLDBを明示的に起動することですPython.

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

LLDBがPATHに対して 'active'をクエリするかのように見えますPythonインストール; Python PATHを使用すると、LLDBがPythonを起動しようとしたときに、この種のクロストークに遭遇する可能性があります。

14
Kevin Ushey

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/" "$(xcrun -f lldb)"

MacOS 10.13.6でbrew'd Python 2.7.15でテスト済み。

更新:システム整合性保護が有効な場合、DYLD_FRAMEWORK_PATHから実行されるXcodeコマンドラインツールのトランポリン実行可能ファイルで/usr/binを使用することは禁止される場合があります。これを回避するには、xcrun -f lldbを実行して、代わりに実際のLLDB実行可能ファイルを使用します。

7
rgov

アンインストールする代わりに、brew unlink python@2を実行するだけです。これにより、HomebrewのPython 2.xがPATHから削除されます。Homebrewの数式の多くはHomebrewのPython 2.xに依存しているため、brew- installed Python 2.x同時にlldbでエラーを修正します。

Homebrew BundleでHomebrewセットアップを管理する場合、次の行をBrewfileに追加できます。

brew "python@2", link: false
4
rootbeersoup

Homebrewからpython@2をアンインストールすることでこの問題を解決しました: https://github.com/flutter/flutter/issues/17803#issuecomment-390980648

UPD:

@Olsonistがコメントで指摘したように、このコマンドを実行するとこの問題を修正する必要があります:brew uninstall --force python@2

0
maksadbek