mymod
и mdir.mymod
считаются разными модулями - вот несколько взаимосвязанное обсуждение: http://code.djangoproject.com/ticket/3951
Объяснение:
Лучше всего играть с Python Interactiveпереводчик и убедитесь сами.Я создал каталог (пакет) mydir
в некотором каталоге и внутри него два файла (модуля) - __init__.py
и mymod.py
, оба пустые.Я запустил python внутри директории, содержащей mydir
.Теперь посмотрим, что происходит:
>>> import mydir.mymod
>>> from mydir import mymod
>>> mymod == mydir.mymod
True
Почему mymod
и mydir.mymod
считаются одним и тем же?Итак, оба имени относятся к одному и тому же объекту модуля - равенство модулей определяется сравнением их путей:
>>> mymod
<module 'mydir.mymod' from 'mydir\mymod.py'>
>>> mydir.mymod
<module 'mydir.mymod' from 'mydir\mymod.py'>
Теперь, если я изменю sys.path
на mydir
и импортируюmymod
таким образом, что путь импортируемого модуля будет казаться другим:
>>> import sys
>>> sys.path.append( "d:/zrodla/stack/mydir" )
# note that importing mymod (and not mydir.mymod) prior to appending mydir to
# path would cause an error
>>> mymod2
<module 'mymod' from 'd:/zrodla/stack/mydir\mymod.pyc'>
>>> mymod2 == mydir.mymod
False
, тогда результирующие объекты модуля не будут сравниваться.Таким образом, один модуль будет импортирован дважды - это нормально, и именно так работает Python.Просто помните, что импортированные модули идентифицируются по их путям - точнее, по «пунктирным путям», я думаю, - посмотрите на sys.modules
ключи:
>>> [x for x in sys.modules.keys() if "my" in x]
['mydir', 'mymod', 'mydir.mymod']
Надеюсь, теперь все ясно.