ImportError: невозможно импортировать имя some_name из '__main__' - PullRequest
0 голосов
/ 05 февраля 2020

Переменная isDevelopment находится внутри manager/__init__.py файла:

 isDevelopment = True

В том же каталоге файл fusion.py пытается импортировать его на уровне файла:

from . import isDevelopment

Примечание: pycharm является двойственным для него: импорт не помечен ни в коем случае:

enter image description here

При попытке импортировать его из какого-либо другого например, .. Pycharm действительно жалуется:

enter image description here

При работе

 python3 manager/fusion.py

происходит следующее:

 ImportError: cannot import name 'isDevelopment' from '__main__'

Еще одна попытка в соответствии с одним из предложений:

from ..manager import isDevelopment

Это приводит к:

ValueError: attempted relative import beyond top-level package

Почему эта попытка import не работает - и что необходимо изменить

Ответы [ 2 ]

1 голос
/ 05 февраля 2020
./test.py
./manager/__init__.py
./manager/fusion.py

__ init __. Py

isDevelopment = True

. / Manager / furation.py

from . import isDevelopment

def checkDevelopment():
    print("isDevelopment = {0}".format(isDevelopment))

. / Test.py

import manager

if __name__ == "__main__":
    print("isDevelopment = {0}".format(manager.isDevelopment))
    manager.checkDevelopment()

Выполнить

python3 ./test.py

Вывод

isDevelopment = True
isDevelopment = True

Вопрос

Вы пытаетесь запустить manager / fusion.py для установки модуля или хотите, чтобы он был частью вашего исполняемого файла? применение? Если вы просто хотите узнать значение isDevelopment в модуле менеджера, это может быть достигнуто. Если вы хотите, чтобы исполняемая функция содержалась в менеджере, изучите точки входа, используя setup.py

0 голосов
/ 05 февраля 2020

__init__.py используется для инициализации пакета. Согласно документации на https://docs.python.org/3/tutorial/modules.html#packages

Пользователи пакета могут импортировать отдельные модули из пакета

Вы не импортируете то, что находится в __init__.py, он запускается автоматически при импорте.

В простейшем случае init .py может быть просто пустым файлом, но он также может выполнять код инициализации для пакета

Поскольку isDevelopment является , а не модулем, вы не можете его импортировать! Если у вас есть другой модуль fusion2.py, вы можете импортировать его с помощью

from . import fusion2

, и там вы сможете увидеть isDevelopment.

...