ModuleNotFoundErrorでつまづいた話
ModuleNotFoundError
python3のパッケージ,pytrendsをimportして使用したところModuleNotFoundErrorが発生して動けなくなった。
最終的に問題は解決したが、単純にpytrends.pyという名前のファイルで実行していたため、参照先がおかしくなってるだけだった。
pythonのパッケージと同じ名前のファイルをつけるのはやめた方が良い。
from pytrends.request import TrendReq
エラーメッセージ
Traceback (most recent call last):
File "[WORKDIR]/pytrends.py", line 1, in <module>
from pytrends.request import TrendReq
File "[WORKDIR]/pytrends.py", line 1, in <module>
from pytrends.request import TrendReq
ModuleNotFoundError: No module named 'pytrends.request'; 'pytrends' is not a package
他の可能性の確認
ちなみに再現性のテストとしてdatetime.pyというファイルを作成してdatetimeモジュールをインポートすると以下のようなエラーメッセージとなった。
from datetime import datetime
Traceback (most recent call last):
File "[WORKDIR]/datetime.py", line 1, in <module>
from datetime import datetime
File "[WORKDIR]/datetime.py", line 1, in <module>
from datetime import datetime
ImportError: cannot import name 'datetime' from partially initialized module 'datetime' (most likely due to a circular import) ([WORKDIR]/datetime.py)
メッセージの内容が変わり、今度は循環参照としてImportErrorが発生した。
どうも最初のpytrendsのModuleNotFoundErrorはpytrends.requestを参照して参照先が存在しないため、NotFoundErrorとなったらしい。
循環参照の方は、datetimeモジュール(この場合は同名のファイル)のみを参照しているためdatetimeファイルの参照自体を行おうとすることはできる。しかし、参照したファイルの内容がまたdatetimeの参照を行なっているため、無限に自分を参照することになり、循環参照となるようだ。
ちなみにfrom
を用いない場合は参照自体は行われるため、datetime.pyのファイル自体に問題がなければエラーは起きないが、自身の処理を2度行うことになるだけで利用用途はなさそうだ。
import datetime
print('hoge')
実行結果
$ python datetime.py
>> hoge
>> hoge
ちなみに、
import datetime
自体を行わなければ何も問題は起こらない。
ただし絶対にやめた方が良い。
最後に
pythonのパッケージ名には気をつけましょう。
もしくは、パスやディレクトリ構成をきちんとしておくのが無難かと。