Ответ 1
Из документов:
вы можете увидеть это:
Относительный импорт использует атрибут name для определения этой позиции модуля в иерархии пакетов. Если имя модуля не содержит никакой информации о пакете (например, оно установлено на " main" ), то относительный импорт разрешается, как если бы модуль был модулем верхнего уровня, независимо от того, где находится модуль в файловой системе.
Запустив его как python moduleX.py
, вы делаете именно это. Вместо этого попробуйте следующее:
python -m package.subpackage1.moduleX
Это импортирует модульX и помещает верхний уровень в пакет. Выполнить из верхней части иерархии:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
то есть. в вашем случае от c:\
напрямую:
c:\>python -m package.subpackage1.moduleX
Обратите внимание на одно: импорт в moduleX.py
таков:
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path
Второе:
from ...package import bar
требует, чтобы корневая папка (c:\
в вашем случае) была пакетом (т.е. имеет __init__.py
). Кроме того, для него требуется переменная bar, определенная в package\__init__.py
, которая в настоящее время не существует (поэтому поставьте bar = 'bar!'
там для теста). Он также требует, чтобы вы были на один уровень вверх - поэтому вам нужно поместить папку package
в другую папку (чтобы вы закончили с c:\toppackage\package
) и запустили c:\python -m toppackage.package.subpackage1.moduleX
.
Для этой строки:
from ...sys import path
есть примечание в приведенной выше ссылке PEP 328:
Обратите внимание, что хотя этот последний закон легален, его, конечно, не поощряют ( "безумным" было слово Гвидо).
См. также другие SOq об этом, которые могут помочь:
- Как сделать относительный импорт в Python?
- Может ли кто-нибудь объяснить относительный импорт python?
- Как выполнить относительный импорт в python
- относительная странность импорта python
- Относительный импорт в Python
Надеюсь, что это поможет.