首页 > 解决方案 > 如何修复 ModuleNotFoundError?

问题描述

我已经阅读了一些 Python 相对与绝对导入教程,但我一生都无法弄清楚这个ModuleNotFound错误。

我正在使用以下目录结构:

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

问题的根源是在analytics_generator.py 文件中,我试图从blueprint.py 导入SomeClass。

当我在 中执行 main 函数时__main__.py,出现以下错误:

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 文件中,如果我将导入语句更改为相对导入,它可以工作: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

非常感谢任何指导!

标签: pythonpython-importpython-3.7

解决方案


不需要指定执行脚本的目录。由于您正在执行__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.pywhich imports a1which 依次导入other,a2sa1. 然后导入语句a1.py如下所示:

  • 绝对进口:

      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错误。


推荐阅读