MacOS更新後にPython実行でModuleNotFoundErrorになる

- Python -
2023.05.30
Python[パイソン]

MacOSをMontereyからVenturaに更新後、Pythonのプログラムを実行したら、Module Not Foundと言われました。

~ % python testapp.py
Traceback (most recent call last):
File "/Users/yuki/Desktop/program/testapp.py", line 3, in <module>
from selenium import webdriver
ModuleNotFoundError: No module named 'selenium'

いや、そんなわけない。Seleniumは毎日のように使ってたのに...なぜだ!?

となってかなり困りました。

pip install seleniumをすると「いやseleniumあるよインストール済みだと」と言われてしまいます。

どうやら、OS更新→MacでPythonを使うのに必要な「Xcode」をインストールした時点で、Pythonの環境がゴッソリと変わってしまった模様。

Pythonバージョンは3.8を使っていたのに、3.9になってしまった(と思う)。

がっつりPythonを使っている最中にこの事態におちいり、かなり焦ったので修正手順をメモしておきます。

MacOSを更新後にPythonでModuleNotFoundErrorになったら

  1. pipでインストールされるモジュール格納パスを確認
  2. sys.pathでPythonが参照しているパスを確認
  3. .zshrcにパスを追加する設定を書く

この3ステップで解決しました。

1. pipでインストールされるモジュール格納パスを確認

pip install <モジュール名>でどこにモジュールが格納されているのかを確認します。

~ % pip install selenium
Requirement already satisfied: selenium in /usr/local/lib/python3.9/site-packages (4.9.0)
Requirement already satisfied: urllib3[socks]~=1.26 in /usr/local/lib/python3.9/site-packages (from selenium) (1.26.6)
・・・省略・・・

/usr/local/lib/python3.9/site-packages にpipでインストールしたモジュールたちがいることが分かります。

2. sys.pathでPythonが参照しているパスを確認

次は、Pythonがモジュールを引っ張るときに参照しているパスに、手順1で確認したパスがあるかどうかをチェック。

ターミナルからPythonを対話モードで起動し、以下のとおりpprintまで叩きます。

~ % python
>>> import sys
>>> from pprint import pprint
>>>
>>> pprint(sys.path)
['',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python39.zip',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/lib-dynload',
'/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages']

↑このlistの中に、手順1で確認したモジュールのパスがないことが原因

つまり、このsys.pathの中に/usr/local/lib/python3.9/site-packagesを追加できればいい、ということになります。

3. .zshrcにパスを追加する設定を書く

~ % sudo vi ~/.zshrc

を叩いたあと、ファイル内ならどこでもいいので以下のように1行追加して保存します。

export PYTHONPATH="<手順1で確認したモジュールのパス>:$PYTHONPATH"

ぼくの場合、

export PYTHONPATH="/usr/local/lib/python3.9/site-packages:$PYTHONPATH"

と入力、保存しました。

保存したら忘れずにsourceコマンドを叩いてさきほどの書き込みを反映させます。

~ % source ~/.zshrc

これで再度Pythonのプログラムを起動して、モジュール読み込みエラーが解決していればOKです。

参考Qiita:pipでモジュールを確かにインストールしたはずがModuleNotFoundErrorと出た時の解決法

↑TOP