2013-03-02 3 views
1

Я смущен о приоритете при импорте модулей и о том, как его изменить.Согласованность приоритетов импорта?

текущий каталог действительно содержит:

l10n/__init__.py 
l10n/moneyfmt.py 

другой каталог (разные, то тока) с дополнительным пакетом действительно содержит:

/opt/l10n/__init__.py 
/opt/l10n/utils.py 

Сейчас работает питон интерактивный интерпретатор:

>>> import sys 
>>> sys.path 
['', '/usr/lib/python27.zip', '/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', 
'/usr/lib/python2.7/site-packages', '/usr/lib/python2.7/site-packages/PIL', 
'/usr/lib/python2.7/site-packages/gtk-2.0', 
'/usr/lib/python2.7/site-packages/setuptools-0.6c11.egg-info'] 
>>> import l10n.utils 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named utils # CORRECT, NOT IN PATH YET 
>>> sys.path.insert(0, '/opt') 
>>> sys.path 
['/opt', '', '/usr/lib/python27.zip', '/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', 
'/usr/lib/python2.7/site-packages', 
'/usr/lib/python2.7/site-packages/PIL', 
'/usr/lib/python2.7/site-packages/gtk-2.0', 
'/usr/lib/python2.7/site-packages/setuptools-0.6c11.egg-info'] 
>>> import l10n.utils 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named utils # WHY IT CAN NOT FIND THE MODULE? 

Почему он не может найти пакет с модулем l10n.utils после того, как я сделал предварительный патч h к пути поиска в sys.path? Поддерживает ли текущий каталог ? Можно ли это изменить?

ответ

2

У вас есть два модуля с именем l10n. В первый раз, когда вы пытаетесь сделать import l10n.utils, неправильный l10n находится на пути. Я подозреваю, что этот неправильный l10n получает кеширование оболочки Python и консультируется, когда вы пытаетесь сделать import l10n.utils во второй раз (независимо от изменения, внесенного вами в sys.path).

Попробуйте перезагрузить оболочку Python, изменив значение sys.path как первое, и сразу же сделайте import l10n.utils.

+0

Ничего себе, если я опускаю первую попытку импорта, он действительно загружает модуль 'l10n.utils'! Есть ли какая-либо документация, касающаяся кэширования импорта? Может ли это как-то очиститься позже? –

+0

@DavidUnric: есть, см. Http://docs.python.org/2/reference/simple_stmts.html#the-import-statement и http://docs.python.org/2/library/sys.html# sys.modules – NPE

+0

Спасибо за быстрый ответ. Все еще находите это немного удивительным поведением. –

Смежные вопросы