Найти - Пользователи
Полная версия: Локальный импорт
Начало » Python для новичков » Локальный импорт
1
Trimso
Привествую!

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

Пример. Имеем приложение и два пакета:
.
├── main.py
├── pkg
│   └── __init__.py
└── site
└── __init__.py
Содержимое обоих __init__.py:
var = 'some value'
Содержимое main.py:
from pkg import var
print var

Запускаем python main.py, получаем ‘some value’. Всё ок, ожидаемо.

Меняем main.py:
from site import var
print var

При запуске получаем:
Traceback (most recent call last):
File "main.py", line 2, in <module>
from site import var
ImportError: cannot import name var

Разбиремся. В интерактивном режиме:
>>> import pkg
>>> pkg
<module 'pkg' from 'pkg/__init__.pyc'>
>>> import site
>>> site
<module 'site' from '/usr/lib/python2.7/site.pyc'>

Понятно, site загрузился из каталога /usr/lib/python2.7/, а не текущего.

Вопросы:
1. Почему пакет загружается не из текущего каталога, ведь sys.path выдаёт {'', ‘/usr/lib/pymodules/python2.7’, ………} - то есть первым идёт текущий.
2. Как сделать, чтобы пакет загружался из текущего местоположения?

Естественно интересует python-way решение и не обходные пути в стиле “переименуй пакет site в somethingAnother”.

PS: Код from .site import var выдаст ValueError: Attempted relative import in non-package
PPS: Python 2.7
reclosedev
Дело в том, что site - это специальный модуль, который импортируется во время инициализации.
Поэтому
Trimso
“переименуй пакет site в somethingAnother”.
или запихать все это в еще один пакет (см. ниже) и будет решением.

Trimso
PS: Код from .site import var выдаст ValueError: Attempted relative import in non-package
В модуле, который можно запустить, нельзя использовать относительный импорт

Так сработает:
.
│ run.py

└───pkg
│ mod.py
│ __init__.py

└───site
__init__.py

mod.py
from .site import var

run.py
from pkg.mod import var
print var


EBFE
import site
reload(site)
или
import imp
file_, filename, desc = imp.find_module('site')
site = imp.load_module('site', file_, filename, desc)
Trimso
EBFE
import site
reload(site)
Красиво, спасибо!

reclosedev
Дело в том, что site - это специальный модуль, который импортируется во время инициализации.
Этого не знал. Огромное спасибо! Думал, что совершенно не понимаю как работает импорт. Оказалось, что не знаю только наполовину ;)

Проблема решена, благодарю.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB