[英]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
,而后者又導入了other
,a2
和sa1
。 然后,a1.py
的import語句如下所示:
絕對進口:
import other import packA.a2 import packA.subA.sa1
請注意,不需要指定import test.other
或import 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.