Ccmmutty logo
Commutty IT
0 pv4 min read

【Python】import でエラーが出る原因と解決法まとめ

https://picsum.photos/seed/108944a637cf4ce08dcc1ed0cbab43ff/1200/630
Pythonを書いていると、たまにながらも、少なからず困らされるimportでのエラー
ModuleNotFoundError: No module named '〇〇'
pip install したのにでたりして、良く困ったので、
よくある原因をまとめてみました。

原因1:単純にインストールされていない

pip install した先が他の仮想環境だったり、仮想環境を変更しながら、installを忘れていた場合によく起こります。
起動した Python がいつもと違ってたりしないかどうかの確認をしましょう。

原因2:pip install 名と import 名が違う(初心者最大の罠)

Python の世界には、インストール名(PyPI の名前)と import 名(実際に import する名前)が一致しないパッケージがたくさんあります。これ、知らないと本当にハマります。
pip install の名前import の名前
beautifulsoup4bs4
pillowPIL
opencv-pythoncv2
pycryptodomeCrypto
python-dateutildateutil
PyYAMLyaml
pywin32win32api
pip install beautifulsoup4 してから import bs4 が正解
調べればでてくるけど、記憶を頼りにやってると、案外起きます。

原因3:ローカルに同名ファイル

事例
プロジェクト直下に yaml.pyrequests.py といったファイルを置いてしまうと、Python はそちらを優先して読み込もうとします。
結果、本家の PyYAMLrequests が読み込めずエラーになる――というパターン。
症状の例
  • ModuleNotFoundError も出るが、ImportError や妙な属性エラーになる
  • パスを見たら、カレントディレクトリが先に来ている
チェック方法
対処
  1. ローカルファイル名を変更する(例:my_yaml.pyyaml_helper.py 等)
  2. __pycache__/ を削除してから再実行

原因4:大文字小文字の違い

Python の import は大文字小文字を区別します。
python
import Numpy   # NG
import numpy   # OK
絶対に小文字というわけでも、絶対に大文字というわけでもないので、調べるしかありません。

おまけ:慣習による as インポート

beautifulsoup4はimport bs4だが、numpyはnpではない。が、npの記述をよく見ると思います。
慣習として、使われているので覚えておくと楽です。 また、どの関数も自在に設定はできます。
import の書き方備考
import numpy as np数値計算。np は世界標準。
import pandas as pdデータ解析。pd は慣習。
import matplotlib.pyplot as pltグラフ描画。長いので短縮。
import tensorflow as tf機械学習ライブラリの慣習。
import seaborn as sns可視化ライブラリの慣習。
ポイント:エラーのときは、まずエイリアスを外して本来の名前で import してみると混乱が減ります。

実は本題 おまけ2:Python から自動でインストールさせる方法

仮想環境をコロコロ切り替えながらも、いちいち、pipでやるのがめんどくさい人の最終手段
実行時に不足モジュールを自動インストールする方法

python
try:
    import numpy

except ModuleNotFoundError as e:
    import subprocess
    import sys

    module_name = str(e).split()[-1].strip("'")  # エラーメッセージからモジュール名取得
    subprocess.check_call([sys.executable, "-m", "pip", "install", module_name])

    import numpy
ちなみに、特におすすめはしていませんので、やる場合は自己責任で

再発防止ミニチェックリスト

  • python -m pip install ... で確実に実行中の Python に入れる
  • pip freeze > requirements.txt を用意して共有する
  • プロジェクト直下にライブラリ名のファイルを置かない(yaml.py など)

Discussion

コメントにはログインが必要です。