ま、そんなところで。

ニッチな技術系メモとか、車輪を再発明してみたりとか.

pyenvでインストールしたpython環境でデバッグができなくて困った件

あれ?デバッガ起動できない・・?

pyenv、 複数のpythonバージョンをあれこれ切り替えることが出来て便利ですね.
システムにインストールされてない特定のバージョン環境で動作するスクリプトを書く必要があるときは、いつも使ってるおなじみツールです.
pyenv-virtualenv の仮想環境モジュールと組み合わせるとさらに利便性が高まりますね.

github.com

github.com

さて、例にもれず特定バージョン向けスクリプトを書くことがありまして・・・
そろそろ動作を見てみようかな、とpyenvでインストールしたpython環境を使ってデバッグをしようとしたところ、以下のエラーに遭遇.

/usr/bin/env /home/hoge/.pyenv/versions/3.8.6/bin/python /home/hoge/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy/launcher 36261 -- /home/hoge/work/presnip/pyscr_dev/prj/main.py 
Traceback (most recent call last):
  File "/home/hoge/.pyenv/versions/3.8.6/lib/python3.8/runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/home/hoge/.pyenv/versions/3.8.6/lib/python3.8/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/hoge/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy/launcher/__main__.py", line 97, in <module>
    main()
  File "/home/hoge/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy/launcher/__main__.py", line 24, in main
    from debugpy.launcher import debuggee
  File "/home/hoge/.vscode/extensions/ms-python.python-2021.12.1559732655/pythonFiles/lib/python/debugpy/launcher/../../debugpy/launcher/debuggee.py", line 8, in <module>
    import ctypes
  File "/home/hoge/.pyenv/versions/3.8.6/lib/python3.8/ctypes/__init__.py", line 7, in <module>
    from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'

んー?
モジュールが無いぞ!・・・と怒られてデバッガが起動してくれません.

ctypeモジュールが見当たらない!?

ModuleNotFoundError: No module named '_ctypes'

ctypesモジュールが見つからないよ!とあるのですが、ctypesって標準でインストールされるはず・・・
んなアホな・・・と versions以下にあるC拡張モジュールのライブラリディレクトリ(3.8.6/lib/python3.8/lib-dynload) を見に行くと・・・

あれまー、ほんとに無い.

あるはずの _ctypes.cpython-38-x86_64-linux-gnu.so が見当たりません.
どうやらビルドされてないようです.

ビルド環境にlibffiが無いとctypesモジュールはビルドされない

いろいろ探し回ったところ、どうもこれっぽいなと思われる記事を発見.

pyenvのpython環境インストールは、インストール環境でpython環境を一式ビルドする方式なんですが、 ビルド環境でlibffiがみつからない場合は ctypeモジュールのビルドをSkipする んだそうで...

stackoverflow.com

いやこれ、python環境でも結構重要な位置づけのモジュールじゃなかったっけ!?
無しでもビルドできちゃうって・・これでいいんだろうか・・・?

$ sudo apt install libffi-dev

$ pyenv install 3.8.6
pyenv install 3.8.6
pyenv: /home/hoge/.pyenv/versions/3.8.6 already exists
continue with installation? (y/N) y

ということで、Ubuntu環境へ libffi の開発用パッケージ libffi-dev をインストールして、pyenvの環境を再インストール(再ビルド)したところ・・・

無事デバッガが動作するようになりました.

めでたく一件落着なんですが、ちょっとこれはメッセージから原因までパッっと分かりづらかった・・・
少なくとも、インストール時に警告ぐらい出してくれてもいいんでないかな・・・

参考情報

Red Hat Enterprise Linux の場合

RedHatの場合は、libffi-devel パッケージですね.
依存関係の都合上、他の開発パッケージ導入時に自動的に入ってるみたいです.

$ sudo yum install libffi-devel

macOSの場合

macOSの場合はbrewでinstallすれば良いみたいです.
こちらは libffi Fomula.
こちらも結構いろんなモジュールから依存関係があるみたいで、どうやら llvm 入れたときに一緒に入ったようでした.

$ brew install libffi