Почему этот абсолютный импорт не работает в Python?

У меня есть два файла Python 2.6, /code/x/X.py:

import imp
print 'running'
logging = imp.load_source('logging', '/code/y/logging.py')

... а также /code/y/logging.py:

from __future__ import absolute_import
import logging as _logging

import sys, os
print sys.path
print os.getcwd()
print _logging

Бег X.py печатает:

running
['/code/x', '/usr/lib/pymodules/python2.6', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/lib/python2.6', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/plat-linux2', '/usr/local/lib/python2.6/dist-packages']
/code/x
<module 'logging' from '/code/y/logging.py'>

Почему не from __future__ import absolute_import заставить import logging импорт будет абсолютным, а не локальным? Другими словами, почему я не вижу модуль системного журнала?

1 ответ

Решение

Проблема оказывается imp.load_source команда. Первый аргумент - это имя, под которым он регистрирует модуль, и последующие операции импорта сначала будут смотреть в загруженных модулях, прежде чем искать путь. Изменение строки для использования другого имени, например:

logging = imp.load_source('logx', '/code/y/logging.py')

... исправляет проблему.

Другие вопросы по тегам