pyenvの扱いにハマったときのことを書き残します.マイナーな事例かもしれません.あと思い出しながら書いているので再現性は低いかも...
(蛇足ですが)はじめに
pyenvはPythonのバージョンや仮想環境を管理できるツールです.local設定をすると作業ディレクトリに移動するだけで環境が切り替わってくれるので便利.
(公式リポジトリはこちら)
自分はWSL2を使っているのでホームディレクトリにcloneしました.macの方はbrewでもインストールできます.
起こったこと
普通に環境を作ってpip install
して使っていたところ,あるとき突然モジュールがpip list
には入っているのにimport
できない...といった問題が発生しました.他の人に聞いても「それは謎」「ちゃんと使ってればそんなことにはならないはず(意訳)」と言われてしまいました.
しょうがないのでpython -m pip install
でだましだまし使っていましたが,このままではpyenvを使っている意味が薄れてしまうので,調査を進めてみます.
調査内容・顛末
とりあえずpip show
してみると,なぜか~/.local
以下にあることに.ここを探してみるとPythonやpipが入っていたので,アンインストール(削除).
その後which python
してみると,これまた変なところ(確か/usr/bin
直下)を指し示されました.よってこれも削除.
終わったか...?とpipを試してみると,
subprocess.CalledProcessError: Command ‘(‘lsb_release’, ‘-a’)’ returned non-zero exit status 1.
というエラーに遭遇.調べるとこんな記事を見つけたので,この通りファイルを書き換え,念のためpyenvから入れ直して終了.
無事環境ごとに入れるモジュールを区別するという,pyenv本来の使い方をできるようになりました.
まとめ・感想
いろんなパスを辿りつつ手探りでなんとか解決できましたが,sudoで無理やりファイルを消してたりするので本当はあまり良くないのかも.余裕があるならUbuntuから入れ直した方が安全だと思います.
Pythonはpyenv経由でしか入れてないはずですし,そもそも新調したてのマシンなのでどさくさに紛れてグローバルなところに入っていた...っていうのも考えにくく,原因は未だ不明です.ただ気を付けるべきこととしては,
- 今いる仮想環境が何か常に意識する(これはプロンプト表示の変更で解決)
- これから使うPythonやpipがどこに入っているか確認する
といったことが挙げられるでしょうか.仮想環境はちゃんと使い分けるから便利なのであって,前提となる部分を蔑ろにしてしまうのは良くないよね~という教訓を得ました.