pipenvで作った環境でPycharmのコード補完がされなかったの対処法


はじめに

pipenvでPythonの仮想環境を作った際に、実行時にエラーは起きないがIDE上でライブラリのインポート時にコード補完が効かない状態になりました。その時に調べたことのまとめです。

結論

  • PycharmのSDK設定から仮想環境を作ればOK
  • pipenvを使い手動で仮想環境を作った時はPycharmへインポートする

経緯

Pythonでプロジェクトを作るのがとても久しぶりだったので、モダンな環境構築の方法を調べたところ、pipenvを使って仮想環境を作るのが良さそうでした。
なので、まずプロジェクトのルートディレクトリでpipenv --python 3を実行し、仮想環境を作りました。
その後、pipenv install 〇〇として依存ライブラリをインストールしました。

この状態で、Pycharmのエディタを開くと、import文のコード補完がされませんでした。よく見ると、上の方に「プロジェクトのSDKが設定されていません」というようなエラーが出ていました。なるほど、先ほど作った仮想環境が見えていないんだが、と思いエディタに促されるまま、雰囲気で設定を行うと、プロジェクトのルートに.venvディレクトリが作成されました。よし、これで行けるはず!と思ったのですが相変わらずimport文の補完が効きませんでした。キャッシュの削除や再起動をしてもだめです。
そこでふとライブラリが本当にインストールされているのか気になり、.venvの中のsite-packagesを確認しみると、インストールしたはずのパッケージが見当たりませんでした。しかし、Pythonスクリプト自体の実行はうまくいくので、恐らくIDEの設定がおかしいのだと思い、調査をはじめました。

原因

まず最初はpipenvが何者なのかほとんどわかっていなかったので、これを調べることからはじめたのですが、pipenvは先ほどから述べている通り、Pythonの仮想環境を作るためのツールです。pipenvで仮想環境を作ると、ディレクトリが作成され、その中にPC上のPythonへのシムリンクが作られます。依存ライブラリはそのディレクトリの中にインストールされ、仮想環境外へ影響が出ないようにしてくれます。

で、このディレクトリなのですが、調べていくとpipenvを実行した場所に作成される訳ではないということがわかりました。pipenv --venvとすると仮想環境のパスが表示されるのですが、自分の場合は/Users/<username>/.local/share/virtualenvs/xxxxxxというようなパスになっていました。
プロジェクトのルートディレクトリに作られた.venvとまったく別物です。つまり、pipenvで作った仮想環境と、Pycharmが見ている仮想環境が違ったからコード補完がされなかったということです。なので、Pycharmの設定でpipenvで作った仮想環境を読み込むように設定すればOKです。

具体的な手順は以下の通りです。

File → Project Structureを開く。

Platform Settings → SDK → 「+」ボタンからAdd Python SDK... を選択。

Existing environmentをチェックし、Interpreterに仮想環境上のPythonのパスを入力。

以上でPycharm上でコード補完が効くようになりました!しかし、仮想環境がプロジェクト外に出るのはちょっと気持ち悪い気もします。そんな時は、仮想環境を作るときにPIPENV_VENV_IN_PROJECT=1という環境変数をセットすると、現在のディレクトリに仮想環境が作成されるので、そのパスをPycharmに読み込ませればOKです。

または、手動でpipenv --python 3とするのをやめて、Pycharmを使って仮想環境を作る方法があります。というか、こちらの方がおすすめです。手順は以下の通りです。

まず、今ある仮想環境を削除します。

pipenv --rm

そして、先ほどのSDK追加のウィンドウで、New environmentにチェックを入れ、<プロジェクトのパス>/.venvというパスを入力します。

これでプロジェクト以下にPythonの仮想環境が作成され、Pycharmにも読み込まれた状態になります!また、Pycharm上のターミナルは、自動で仮想環境にログインした状態で立ち上がるようになります。

実は、このPycharmで仮想環境を作る作業、最初に雰囲気でSDK設定していた時にやっていたのですが、どうやら最初に手動で作った仮想環境が優先されるようで、後からPycharmで作った仮想環境にはライブラリがインストールされませんでした。そのせいですごくハマりました...。
なので、既に手動で仮想環境を作ってしまった時は、今ある仮想環境を削除してから作業するのを忘れずに!