[Python]VSCode + MacでModuleNotFoundErrorが出る場合の対処方法

modern art python
Photo by Adrien Olichon on Pexels.com

発端

今までPython環境としてAtomを利用していたが、開発中止から数年経ち、さすがにどうしようもなくなり、VSCodeに乗り換え(Pulsarという継続アプリもあるらしい)。と思ったものの、JupyterLabなどとぶつかり、にっちもさっちもいかない状態に。VSCodeを導入したところ、venv周りの設定でエライ苦労したので、備忘録として記載。

まずは、どうしようもないので以下を参考に、環境のお掃除。

Macの場合、基本的にホームディレクトリ(/User/…)に色々インストールされていくので、ファイルの可視化(Shift + command + .)で普段は見えないファイルを見えるようにして、ズカズカ消していく。「Jupyer」や「.ipython」といったフォルダもどんどん削除して良い。

その後、Homebrew経由、pyenvでpython環境を構築しておく(いつもここを参考にしている)。ホームディレクトリに「python_env」という名前のフォルダを作り、その中に「py39env」や「py311env」などを作り、Pythonのバージョンを切り替えていく。

VSCode

インストール方法はHomebrewでもVSCodeのサイトからでもOK。インストール後、左側のExtensionから、Python, Jupyterなどをインストールしておく。

ここから拡張機能を追加しておく。

Interpreterの設定

この時点で、運が良ければ何も考えずそのままPythonスクリプトを実行できる。ただし、numpyやpandasなどのModuleをimportしようとすると、「ModuleNotFoundError」が出現する。これは、Mac本体のPython環境と、VSCodeのPython読み込み環境が異なるためである。試しに、ターミナルアプリケーションと、VSCodeのTERMINAL(command + Jで出現)で

which python

を実行してみたり、VSCode上で

import sys
print(sys.executable)

を実行してみると、異なるPathが表示されるはずである。

解決方法

色々なサイトで色々なことを言っていたが、重要なのは、moduleをinstallした仮想環境と、Python interpreterの環境とを一致させることである。

VSCodeの右下で、Interpreterを選択し(上の画像で3.9.20とでているところ)、ここから上部の検索ウインドウで”Enter interpreter path”を選択。ここに、

~/python_env/py39env/bin/python3.9

と入力する。重要なのは、

~/.pyenv/versions/3.9.20/bin/python

ではなく、必ずvenvで作成したPython仮想環境のバージョンを選択することである。また、コードをInteractive windowで実行している場合は、そちらの環境も同じにしておく(下図)。

こちらのInterpreterも同じ環境を指定する。

ここが設定できていれば、”Extra path”などの設定は基本的に必要ないと考えられる。

これだけなのに、エライ時間がかかってしまった・・・。参考までに、VSCodeのsetting.jsonも残しておく。

{
    "python.defaultInterpreterPath": "/Users/UserName/python_env/py311env/bin/python3.11",
    "python.terminal.activateEnvironment": false,
    "python.autoComplete.extraPaths": [
        "/Users/UserName/python_env/py311env/bin/python3.11"
    ],
    "window.zoomLevel": 1,
    "extensions.experimental.affinity": {
        "ms-toolsai.jupyter": 1,
        "ms-toolsai.jupyter-renderers": 1,
        "ms-python.python": 1,
        "ms-python.vscode-pylance": 1
    },
    "jupyter.interactiveWindow.textEditor.executeSelection": true,
    "macros": {
        "jupyterExeSelThenCursorDown": [
            "jupyter.execSelectionInteractive",
            "cursorDown"
        ]
    },
    "python.analysis.extraPaths": [
        "/Users/UserName/python_env/py39env/bin/python3.9",
        "/Users/UserName/python_env/py311env/bin/python3.11",
        ""
    ]
}

参考サイト

https://zenn.dev/mn87/articles/3b39cdb51521b6
https://qiita.com/SNQ-2001/items/3a832fd906db807b8a36
https://4ag4126.blogspot.com/2023/02/vscodemodulenotfounderror.html

参考記事

PythonによるWebスクレイピング
PythonでのスクレイピングとCSVファイルへ書き込み
JSONファイル中にhtmlリンクやimgリンクを入れ込む

コメント

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