Ответ 1
Изменить: по мере того, как OP упомянул, что проблема является относительной, предпочтительной для абсолютного, самым простым решением для конкретной проблемы OP является добавление в начале модуля from __future__ import absolute_import
который изменяет это предпочтение/порядок.
Следующее по-прежнему относится к щекотливой проблеме двух столкновений с абсолютным импортом (который, похоже, не является тем, что в настоящее время находится в OP):
После того, как вы импортировали модуль с именем 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 была смещена), но при необходимости вы могли бы использовать дополнительные хрупкие трюки ( stash sys.modules["foo"]
где-то перед его удалением, после того, как вы импортируете другой foo, поместите этот модуль в другое место и восстановите оригинал sys.modules["foo"]
- и т.д. и т.д.), в зависимости от ваших точных потребностей. (Конечно, избежать столкновений имен в первую очередь было бы почти всегда проще, чем вальсировать вокруг них таким образом; -).