У меня есть пакет с именем 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. Это имеет значение?
Я не думал об импортных крючках. Хотя 'foo.' * does *, похоже, регистрируется в sys.modules при вызове' __import__'. –
Если '__import __()' добавляет 'foo.', тогда давайте посмотрим на крючки импорта! Добавьте к вашему вопросу вывод на печать 'sys.metapath' и' sys.path_hooks' и, если найдете, попробуйте поделиться с нами своим кодом. –
Обновлено. Это не похоже, что у меня есть какие-то крючки импорта, которые необычны. –