Help us understand the problem. What is going on with this article?

Pythonのimportでcannotと言われたらファイル名を見直す

More than 3 years have passed since last update.

参考:[Python][お勉強] Python入門(35) - インポートの処理

tqdm.py
from tqdm import tqdm
from time import sleep

for i in tqdm(range(10)):
  sleep(1)

Output
Traceback (most recent call last):
  File "./tqdm.py", line 1, in <module>
    from tqdm import tqdm
  File "~/tqdm.py", line 1, in <module>
    from tqdm import tqdm
ImportError: cannot import name tqdm

何気なくファイル名を新しいmoduleテストとしてファイル名を同名にしてしまい起きてしまったエラーです。

単純にファイル名を変更することで回避できます。

何故なのか

参考より引用


1. インポート対象のモジュールファイルを探す
モジュールファイルを探すのにはモジュールサーチパスなるものが利用される。
基本的にはモジュールサーチパスは自動で設定される。
モジュールサーチパスは4つの要素を持つ。その要素を以下に記す。

  1. トップレベルファイルのホームディレクトリ
  2. 環境変数PYTHONPATHで指定されたディレクトリ
  3. 標準ライブラリモジュールのディレクトリ
  4. .pthファイルの内容

モジュールサーチパスを変更するときは、通常、環境変数PYTHONPATHか.pthを変更する。
1が最初に検索され、なければ2を。最後に4を検索される。

トップレベルファイルのホームディレクトリ
ホームディレクトリとは、通常トップレベルファイルが置かれているディレクトリを指す。
モジュールインポート時には最初に検索される場所。

環境変数PYTHONPATH
環境に依存したディレクトリパスを記述しておく環境変数。
複数の値を設定でき、複数指定された場合には左端から順に検索される。
設定された値がトップレベルファイルのホームディレクトリの次に検索される場所になる。

標準ライブラリモジュールのディレクトリ
標準ライブラリがインストールされているディレクトリ。
環境変数PYTHONPATHの値の次に検索される場所。

.pthファイルの内容
一行に1パスづつ複数行指定できる。このファイルを「適切な場所」に設置すると
.pthファイルの内容の最初の行から順にそれぞれの行の値の場所を検索してくれる。
「適切な場所」がどこかは今のところ不明。

要約すると

「オッス!おらtqdm.pyってファイルだ!importでtqdmって呼び出しあるけどおらそんなmodule知らねぇだ。でもおらが呼ばれてるからどうすんべかなぁ・・・。とりあえずエラー吐いとくぞ!!!」

大体合ってる。

m1zu7k1t4n
こーせんせーだよ
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away