Как исправить ModuleNotFoundError? - PullRequest
1 голос
/ 05 мая 2019

Я прочитал несколько руководств по относительному и абсолютному импорту в Python и не могу понять эту ошибку ModuleNotFound на всю жизнь.

Я работаю со следующей структурой каталогов:

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

Корень проблемы в том, что в файле analytics_generator.py я пытаюсь импортировать SomeClass из blueprint.py.

Когда я выполняю основную функцию в __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

Любое руководство очень ценится!

1 Ответ

0 голосов
/ 05 мая 2019

Каталог, в котором выполняется скрипт, указывать не нужно. Так как вы выполняете __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 other
      import packA.a2
      import packA.subA.sa1
    

Обратите внимание, что нет необходимости указывать import test.other или import test.packA.test.other (где test - каталог, в котором выполняется скрипт start.py). Тот же принцип должен применяться к вашей ситуации, независимо от __init__.py или не , если вы используете Python 3.3 и выше.


Для потомства и полноты я процитирую другой раздел руководства:

[...] когда Python запускает скрипт, его содержащая папка не считается пакетом.

Это объясняет ошибку 'pseudo' is not a package.

...