导入的模块中无法使用相对导入

4

我有一个类似以下结构的程序:

test\test.py
test\modules\base.py
test\modules\blah.py

我需要按名称加载模块。每个模块都实现了一个具有相同方法的类,因此我将它们加载到字典中,以便在需要时引用它们。当尝试进行相对导入时,我遇到了以下错误。
  File "modules/blah.py", line 1, in <module>
    from .base import BaseModule
ImportError: attempted relative import with no known parent package

有没有办法从使用importlib导入的代码中使用相对导入?我正在使用Python 3。以下是一个简单的示例,显示了这个错误...
test\test.py:
#!/usr/bin/env python
import importlib
class Test():
    def __init__(self):
        spec = importlib.util.spec_from_file_location("blah", "modules/blah.py")
        mod = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(mod)
def main():
    t = Test()
if __name__ == '__main__':
    main()

test\modules\base.py:

class BaseModule():
    modulename = "base"
    def __init__(self,name):
        print("Initializing module %s" % (self.modulename))

test\modules\blah.py:

from .base import BaseModule
class BlahModule(BaseModule):
    modulename = "blah"

1
https://napuzba.com/a/import-error-relative-no-parent/ - Leonid
1
@Leonid,我不理解napuzba.com页面。页面中有很多引用到一个未在文件系统中显示的demos(/toplevel/project/demos/demo.py)文件夹,并且没有解释demos是从哪里来的。该目录似乎被命名为package,但他们却称其为demos。这是怎么回事? - greymatter
1个回答

0

添加以下代码应该会有帮助:

import os
import sys


module_path = "modules/blah.py"
module_dir = os.path.dirname(module_path)
if module_dir not in sys.path:
    sys.path.append(module_dir)
# do actual import of module here 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接