LoginSignup
1
0

More than 1 year has passed since last update.

ModuleNotFoundError でつまづいた話

Posted at

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のパッケージ名には気をつけましょう。
もしくは、パスやディレクトリ構成をきちんとしておくのが無難かと。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0