簡體   English   中英

如何修復ModuleNotFoundError?

[英]How to fix ModuleNotFoundError?

我讀過一些Python相對vs.絕對導入教程,在我的生命中無法弄清楚這個ModuleNotFound錯誤。

我正在使用以下目錄結構:

project
 |    
 +-- pseudo
 |  |  
 |  +-- __main__.py  
 |  |
 |  +-- pseudo.py
 |  |  
 |  +-- analytics_generator
 |      |
 |      +-- analytics_generator.py
 |      |
 |      +-- models
 |         |
 |         +-- blueprint.py 

問題的根源在於,我正在analytics_generator.py文件中嘗試從blueprint.py導入SomeClass。

當我在__main__.py執行main函數時,出現以下錯誤:

Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1741, in <module>
    main()
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1735, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1135, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File ".../project/pseudo/__main__.py", line 2, in <module>
    from pseudo import Pseudo
  File ".../project/pseudo/pseudo.py", line 4, in <module>
    from analytics_generator.analytics_generator import AnalyticsGenerator
  File ".../project/pseudo/analytics_generator/analytics_generator.py", line 1, in <module>
    from models.blueprints import SomeClass
ModuleNotFoundError: No module named 'models'

我正在Pycharm中運行腳本,我的工作目錄是.../project/pseudo

在analytics_generator.py文件中,如果我將import語句更改為相對導入,則它可以工作: from .models.blueprints import SomeClass

但是,使用完整路徑不會:

from pseudo.analytics_generator.models.blueprints import SomeClass引發:

ModuleNotFoundError: No module named 'pseudo.analytics_generator'; 'pseudo' is not a package

任何指導深表感謝!

無需指定執行腳本的目錄。 由於您正在執行__main__.py ,因此應該執行以下操作:

from analytics_generator.models.blueprint import SomeClass

資料來源/進一步閱讀: Python導入的權威指南語句:絕對與相對導入

示例目錄結構

  test/ # root folder packA/ # package packA subA/ # subpackage subA __init__.py sa1.py sa2.py __init__.py a1.py a2.py packB/ # package packB (implicit namespace package) b1.py b2.py math.py random.py other.py start.py 

例如,假設我們正在運行start.py ,其中導入了a1 ,而后者又導入了othera2sa1 然后, a1.py的import語句如下所示:

  • 絕對進口:

      import other import packA.a2 import packA.subA.sa1 

請注意,不需要指定import test.otherimport test.packA.test.other (其中test是執行腳本start.py的目錄)。 鑒於您使用的是Python 3.3及更高版本, 無論是否使用__init__.py都應遵循相同的原則。


為了后代和完整性,我將引用指南的另一部分:

[...] Python運行腳本時,其包含的文件夾不被視為軟件包。

這說明'pseudo' is not a package錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM