Пример кода относительного импорта Python не работает
Возможный дубликат:
Как правильно использовать относительный или абсолютный импорт в модулях Python?
У меня есть этот макет файла, как показано в этом примере: (скачать здесь: http://www.mediafire.com/?oug42nzvxrvoms4) http://www.python.org/dev/peps/pep-0328/
moduleX содержит:
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
и вот что происходит:
C:\package\subpackage1>python moduleX.py
Traceback (most recent call last):
File "moduleX.py", line 1, in <module>
from .moduleY import spam
ValueError: Attempted relative import in non-package
У меня есть Python 2.7.2. я имею
__init__.py
файлы в каждом каталоге. Почему этот код не работает?
1 ответ
Из документов:
Вы можете увидеть это:
Относительный импорт использует атрибут имени модуля для определения позиции этого модуля в иерархии пакетов. Если имя модуля не содержит никакой информации о пакете (например, для него установлено значение "main"), то относительный импорт разрешается так, как если бы модуль был модулем верхнего уровня, независимо от того, где этот модуль фактически расположен в файловой системе.
Запустив его как python moduleX.py
Вы делаете именно выше. Вместо этого попробуйте это:
python -m package.subpackage1.moduleX
Это импортирует moduleX и помещает верхний уровень в пакет. Запустите с вершины иерархии:
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 есть примечание:
Обратите внимание, что, хотя этот последний случай является законным, он, безусловно, не рекомендуется (слово "безумный" использовалось Гвидо).
Смотрите также другие SOqs об этом, которые могут помочь:
- Как сделать относительный импорт в Python?
- Кто-нибудь может объяснить относительный импорт Python?
- Как выполнить относительный импорт в Python
- странность импорта относительного Python
- Относительный импорт в Python
Надеюсь это поможет.