Почему этот абсолютный импорт не работает в 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')
... исправляет проблему.