Получение ошибки импорта: нет модуля с именем ***, но имеет __init__.py

Я понимаю, что этот вопрос задавали несколько раз, но, прочитав их и сделав предложенные исправления, я все еще не могу понять.

Моя структура проекта выглядит следующим образом:

Project
      |
      src
        |
         root - has __init__.py
            |
            nested - has __init__.py
                  |
                  tests - has __init__.py
                  |
                  utilities - has __init__.py
                  |
                  services - has __init__.py

Я успешно запускаю unittest класс регрессии из Eclipse без каких-либо проблем.

Как только я попытался запустить тот же класс из командной строки (поскольку другие пользователи, которые будут работать с пакетом, не имеют доступа к Eclipse), я получаю сообщение об ошибке:

ImportError: No module named 'root'

Как вы можете видеть выше, корень модуля имеет __init__.py Все модули __init__.py полностью пусты.

И помощь будет с благодарностью воспринята.

Ответ 1

Попробуйте добавить sys.path.append в список импорта.

import sys
sys.path.append("/Project/src/")
import root
import root.nested.tests

Ответ 2

Просто заметьте для всех, кто приходит к этой проблеме, используя то, что Gus E показал в ответе на прием, и некоторый дополнительный опыт. Я нашел следующее, чтобы быть очень полезным, чтобы гарантировать, что я могу запускать свои программы из командной строки на моей машине или на другом коллеге, если возникнет такая необходимость.

import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))

Когда я выполняю метод "main", который находится в "вложенном" каталоге, он гарантирует, что каталог "src" будет добавлен в PYTHONPATH во время выполнения, что означает, что все последующие импорты не будут вызывать ошибку.

Очевидно, вам нужно настроить количество аргументов ".." методу os.path.join(), определяемому местоположением в вашей программе, где ваш основной метод выполнен из

Ответ 3

Если кто-нибудь приземлится здесь:

Я также столкнулся с этой ошибкой. В моем случае я использовал ~/my/path/ at path.sys.append(...), и исправление path.sys.append(...) ~ на явное имя пути (его можно узнать, если вы pwd когда вы находитесь в linux). или используйте os.path.expanduser(..))

Ответ 4

Еще один способ решить эту проблему без пути выглядит следующим образом: рассмотрим следующий код, где внутри вашей папки с именем "app" у вас есть 3 файла x.py, y.py и пустой init.py. Итак, для запуска x.py у вас есть импорт из y такой, что:

x.py

from app.y import say_hi
print ("ok x is here")
say_hi()

А также

y.py

print ("Im Y")
def say_hi():
    print ("Y says hi")

поэтому структура папок будет выглядеть так:

testpy
       app
           __init__.py
           x.py
           y.py

Решение: в папке ДО приложения сделайте следующее:

$ python -m app.x

Примечание: я не использовал x.py (просто app.x)

Результат:

[email protected] MINGW64 ~/Desktop/testpy
$ python -m app.x
Im Y
ok x is here
Y says hi