Редактировать : поскольку ФП упомянул, что проблема заключается в относительном импорте, который предпочтительнее абсолютного, самое простое решение для конкретной проблемы ФП - добавить в начале модуля from __future__ import absolute_import
который меняет это "предпочтение" / ordering .
Следующее по-прежнему относится к щекотливой проблеме двух конфликтующих абсолютных импортов (что, кажется, не то, с чем сейчас сталкивается ОП):
После того, как вы импортировали модуль с именем x
, этот модуль записан в sys.modules['x']
- изменение sys.path, как вы делаете, не изменит sys.modules. Вам также необходимо изменить sys.modules напрямую.
Например, рассмотрим:
$ cat a/foo.py
print __file__; import sys; sys.path.insert(0, "b"); del sys.modules["foo"]; import foo
$ cat b/foo.py
print __file__
$ python2.5 -c'import sys; sys.path.insert(0, "a"); import foo'
a/foo.py
b/foo.py
(при повторном запуске файлы .pyc будут показаны вместо файлов .py, конечно).
Не самый чистый подход, и, конечно, таким образом, оригинальный модуль foo неизбежно больше не будет доступен извне (так как его запись в sys.modules была смещена), но вы можете по мере необходимости выполнять дополнительные хрупкие трюки ( Сохраните sys.modules["foo"]
где-нибудь перед его удалением, после того, как вы импортируете другой файл, поместите этот модуль в другое место и восстановите исходный sys.modules["foo"]
- и т. д.), в зависимости от ваших конкретных потребностей. (Конечно, во-первых, избежать столкновений имен было бы почти всегда проще, чем вальсировать вокруг них таким образом; -).