Динамический импорт модуля Python с Windows и Linux - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь динамически импортировать модуль Python, используя importlib.

Мой проект представляет собой приложение-функцию Azure и имеет следующую файловую структуру:

Shared_Code/
├── __init__.py
├── model.py
└── rule_engine.py

В файле rule_engine.py Я пытаюсь импортировать model.py:

logging.info(__name__)
importlib.import_module(
    'Shared_Code.model', package=None
)

Приведенный выше код печатает

__app__.Shared_Code.rule_engine.py

и правильно импортирует модуль в Linux и Azure Cloud .

Однако при выполнении точно такого же кода на Windows появляется ошибка, что модуль Shared_Code не может быть найден.

Затем я использовал следующее

importlib.import_module(
    '__app__.Shared_Code.model', package=None
)

, который работает на обоих, но прерывается при запуске на Azure Cloud .

Существует ли общее решение для этого без необходимости выполнять ручные проверки и предложения if в зависимости от ОС?

1 Ответ

1 голос
/ 07 июня 2019

Вы можете попробовать импортировать model, используя относительный путь:

importlib.import_module('.model', package='Shared_Code')

Редактировать : После некоторых исследований я пришел к выводу, что это проблема с Azure, а не с Python.

Не существует одного совпадения строки __app__ в полном коде CPython .

Тем не менее, это PR Azure-functions-python-worker , где модуль верхнего уровня __app__ реализован для абсолютного импорта.

Полагаю, это ошибка в Azure-functions-python-worker или любой другой платформе Azure, на которой вы работаете, где они ведут себя по-разному в Linux и Azure Cloud VS Windows.

Единственное, что я думаю, вы можете сделать:

  • Посмотрите, есть ли какая-либо конфигурация в вашей службе Azure, может быть, в Windows по умолчанию что-то другое (я не работаю с платформой Azure, извините).
  • Заполните вопрос в azure-functions-python-worker , пытаясь включить минимальный воспроизводимый пример, и посмотрите, о чем они думают (возможно, у них есть ответ, возможно, вы нашли ошибку).
  • Решение Pythonic: импортируйте модуль без __app__ внутри try/except ModuleNotFoundError, а в случае сбоя импортируйте его снова с __app__:
try:
    importlib.import_module(
        'Shared_Code.model', package=None
    )
except ModuleNotFoundError:
    # In Windows, __app__ is mandatory
    importlib.import_module(
        '__app__.Shared_Code.model', package=None
    )

Я знаю, что последнее именно то, о чем вы просите , а не , но если это проблема с платформой (и я уверен, что это так), вы ничего не можете сделать, кроме иметь дело с этим.

...