Форум сайта python.su
0
Привествую!
Помогите, пожалуйста, разобраться с локальным импортом. Никак не пойму, как импортировать локальный пакет.
Пример. Имеем приложение и два пакета:
.
├── main.py
├── pkg
│ └── __init__.py
└── site
└── __init__.py
var = 'some value'
from pkg import var print var
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'>
Отредактировано Trimso (Авг. 17, 2012 16:56:32)
Офлайн
173
Дело в том, что 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
from .site import var
from pkg.mod import var print var
Отредактировано reclosedev (Авг. 17, 2012 18:47:01)
Офлайн
20
import site reload(site)
import imp file_, filename, desc = imp.find_module('site') site = imp.load_module('site', file_, filename, desc)
Отредактировано EBFE (Авг. 17, 2012 19:04:00)
Офлайн
0
EBFEКрасиво, спасибо!
import site
reload(site)
reclosedevЭтого не знал. Огромное спасибо! Думал, что совершенно не понимаю как работает импорт. Оказалось, что не знаю только наполовину ;)
Дело в том, что site - это специальный модуль, который импортируется во время инициализации.
Офлайн