venvを使用している時に「ModuleNotFoundError: No module named ‘xxx’」と出てくる

error-image python

はじめに

venv の環境構築を行った後、別の環境で動作確認済みのコードを VSCode + code runner で実行したところ「ModuleNotFoundError: No module named ‘PIL’」というエラーが出たので対応しました。

環境

Mac Monterey 12.6
Python 3.9.6
VSCode 1.73.0
Code Runner 0.11.8

対応

仮想環境上のライブラリではなくシステムにインストールしたライブラリを見に行ってしまっているようです。
対応として、仮想環境上に存在するインタプリタを利用するように変更を行い、仮想環境内のライブラリを使用するようにします。

1.作成した仮想環境内にある「bin」フォルダのパスを取得する

Macの場合は作成した仮想環境フォルダ内にある「bin」フォルダの絶対パスを取得します。
対象となる「bin」フォルダは上記のコマンドで作成した「newenvname」の中にあります。

python3 -m venv [newenvname]

「newenvname」はユーザーごとに違った名前をつけていると思います。
多くのサンプルコードでは「venv」 という名前でフォルダを作成しているようです。

Windows環境の場合は「 [newenvname]/Scripts/python.exe 」の絶対パスを取得すればOKでした。

2.仮想環境内のインタプリタをVSCodeに追加する

VSCode を開き、「F1」キーを押下しコマンドパレットを開きます。
次にコマンドパレットに「Python: Select Interpreter」と入力し、出てきた項目をクリックします。
「+ インタプリタ パスを入力…」をクリックし、コピーしていた「bin」か「python.exe」のパスを貼り付けエンターを押します。

3.使用するインタプリタを変更する

もう一度コマンドパレットを開き「Python: Select Interpreter」を入力します。
先程追加したパスが項目に出てくるので、クリックし使用するインタプリタを変更します。

4.setting.jsonを編集する

Command + Shift + P を押しコマンドパレットを開きます。
入力欄に「settings」 と入力し「Preferences: Open Workspace Settings (JSON)」 をクリックします。

その後、開いた setting.json に以下の記述を追加します。

  "code-runner.executorMap": {
    "python": "$pythonPath -u $fullFileName"
    },

code runner プラグインが利用するインタプリタをここで指定してあげます。

以上で作業は終了です。

最後に

プロジェクトを作成する度にインタプリタのパスをいちいち追加するのが嫌だなぁと思っています。
人と共同でプロジェクトを行う際もやりにくい。

対策として setting.json に

"python.defaultInterpreterPath": "../venv/bin",

と追加したところいちいちパスを追加しなくとも
インタプリタの選択欄に venv のインタプリタが項目に追加されたので
こっちのほうがいいかなと思っています。

タイトルとURLをコピーしました