0

我正在尝试使用动态导入 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

并在LinuxAzure Cloud上正确导入模块。

但是,在Windows上执行完全相同的代码时,我收到一个错误,即Shared_Code找不到该模块。

然后我使用了以下

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

它适用于两者,但在Azure Cloud上运行时会中断。

是否有一个通用的解决方案,而无需根据操作系统执行手动检查和 if 子句?

4

1 回答 1

3

您可以尝试model使用相对路径导入:

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

编辑:经过一些研究,我得出的结论是这是一个 Azure 问题,而不是 Python 问题。

完整的CPython 代码中没有一个字符串的巧合。__app__

但是,在这个 azure-functions-python-worker PR中,__app__顶级模块是为绝对导入实现的。

我猜这是 azure-functions-python-worker 或您正在使用的任何 Azure 平台中的一个错误,它们在 Linux 和 Azure Cloud VS Windows 之间有不同的行为。

我认为你能做的唯一事情是:

  • 查看您的 Azure 服务中是否有一些配置,可能在 Windows 中默认情况有所不同(我不使用 Azure 平台,抱歉)。
  • 在azure-functions-python-worker中填写一个问题,尝试包含一个最小的可重现示例,看看他们的想法(也许他们有答案,也许你发现了一个错误)。
  • Pythonic 解决方案:在没有__app__a的情况下导入模块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
    )

我知道这最后一个正是你要求不要做的事情,但如果这是一个平台问题(我很确定它是),除了处理它之外你无能为力。

于 2019-06-07T07:29:14.263 回答