【问题标题】:Using importlib to dynamically import module(s) containing relative imports使用 importlib 动态导入包含相对导入的模块
【发布时间】:2018-11-25 19:15:18
【问题描述】:

我试图弄清楚如何以编程方式执行包含相对导入的模块。

伪代码

spec = importlib.util.spec_from_file_location(name, path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)

其中name是类,path是.py的绝对路径

当正在加载的模块包含相对导入时,对 exec_module 的调用会引发以下异常:

尝试在没有已知父包的情况下进行相对导入

有没有办法以编程方式执行本身包含相对导入的 python 模块?如果有,怎么做?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    你的代码对我来说很好用。

    一个可能的问题是您使用的name 的值是什么。为了使相对导入起作用,您需要完全指定模块名称(例如name = "package1.package2.mymodule")。

    例如:

    runimport.py

    import importlib
    import os
    
    name = "testpack.inside" # NOT "inside"
    
    spec = importlib.util.spec_from_file_location(name, 
        os.path.join(os.path.dirname(__file__), 'testpack/inside.py'))
    mod = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(mod)
    

    testpack/init.py

    # empty
    

    testpack/inside.py

    from . import otherinside
    print('I got', otherinside.data)
    

    testpack/otherinside.py

    data = 'other inside'
    

    现在,python3 runimport.py 打印“我在里面有其他东西”。如果将名称替换为“inside”,则会引发您描述的错误。

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 2021-12-03
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多