2010-06-10 3 views
4

У меня есть пакет с именем jiva_tasks, который я пытаюсь импортировать с помощью сельдерея (с помощью атрибута celeryconfig CELERY_IMPORTS оператор импорта, что сельдерей использует это:Является ли эта функция __import__ правильной? .

__import__(module, [], [], ['']) 

Как ни странно, когда этот синтаксис используется, модуль получает импортированный дважды, один раз как jiva_tasks, а в другой раз jiva_tasks. (с периодом в конце). Теперь шансы на то, что сельдерей должен проходить в глобалях, а не в пустом списке, но это кажется Мне кажется странным, что даже если заданы неправильные аргументы, __import__ импортирует некоторые которое не является допустимым именем модуля python.

Я знаю, что способ исправить это должен пройти в globals, но я хочу понять, почему я получаю этот результат. Это ошибка, или есть что-то, что я не понимаю о том, как работает __import__?

Обновление: Это также работает нормально, если я использую importlib.

Update 2: Вот sys.meta_path и sys.import_path прямо перед __import__ линия запускается на выполнение:

>>> sys.meta_path 
[] 
>>> sys.path_hooks 
[<type 'zipimport.zipimporter'>] 

Это не кажется мне, что нет ничего необычного. Тем не менее, я только сейчас понял, что пакет, который я импортирую, устанавливается с помощью команды разработки setuptools. Это имеет значение?

ответ

1

Создание пустого файла «foo.py», а затем создать «bar.py», который говорит:

__import__('foo', [], [], ['']) 
import sys 
print sorted(sys.modules) 

распечатывает список, который включает только foo один раз, а не foo. или что-нибудь еще с конечная точка - так что дело не только в том, что сельдерей использует __import__, что вызывает проблему здесь. Можете ли вы выяснить, что делает дополнительный шаг сельдерея, который добавляет второй модуль? (Или делает print sorted(sys.modules) прямо до и после звонка __import__(), предположим, что оба модуля появляются в тот момент - в этом случае нам нужно посмотреть, какие импортные крючки определены на момент импорта?)

+0

Я не думал об импортных крючках. Хотя 'foo.' * does *, похоже, регистрируется в sys.modules при вызове' __import__'. –

+0

Если '__import __()' добавляет 'foo.', тогда давайте посмотрим на крючки импорта! Добавьте к вашему вопросу вывод на печать 'sys.metapath' и' sys.path_hooks' и, если найдете, попробуйте поделиться с нами своим кодом. –

+0

Обновлено. Это не похоже, что у меня есть какие-то крючки импорта, которые необычны. –