Является ли эта функция __import__ правильной? - PullRequest
4 голосов
/ 10 июня 2010

У меня есть пакет с именем jiva_tasks, который я пытаюсь импортировать через celery (используя атрибут CELERY_IMPORTS celeryconfig. Оператор импорта, который использует celery, таков:

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

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

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

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

Обновление 2 : Вот sys.meta_path и sys.import_path прямо перед выполнением строки __import__:

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

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

1 Ответ

1 голос
/ 15 июня 2010

Создание пустого файла "foo.py", а затем создание "bar.py" с надписью:

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

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

...