如何在不执行 python -m 的情况下使用相对导入?

How to use relative import without doing python -m?

我有一个这样的文件夹

/test_mod
    __init__.py
    A.py
    test1.py
    /sub_mod
        __init__.py
        B.py
        test2.py

我想像这样在 test1test2 中使用亲戚导入

#test1.py
from . import A
from .sub_mod import B
...

#test2.py
from .. import A
from . import B
...

当我开发 test1test2 时,我希望这些导入在我处于 IDLE 时工作,也就是说,如果我在 test2 中工作时按 F5 ] 一切正常,因为我不想做 python -m test_mod.sub_mod.test2 例如。

我已经检查过了 python-relative-imports-for-the-billionth-time

看着那个,我试过这个:

if __name__ == "__main__" and not __package__:
    __package__ = "test_mod.sub_mod"
from .. import A
from . import B

但这没有用,它给出了这个错误:

SystemError: Parent module 'test_mod.sub_mod' not loaded, cannot perform relative import

最后我找到了这个解决方案

#relative_import_helper.py
import sys, os, importlib

def relative_import_helper(path,nivel=1,verbose=False): 
    namepack = os.path.dirname(path)
    packs = []
    for _ in range(nivel):
        temp = os.path.basename(namepack)
        if temp:
            packs.append( temp )
            namepack = os.path.dirname(namepack)
        else:
            break
    pack = ".".join(reversed(packs))
    sys.path.append(namepack)
    importlib.import_module(pack)
    return pack

我用 as

#test2.py
if __name__ == "__main__" and not __package__:
    print("idle trick")
    from relative_import_helper import relative_import_helper
    __package__ = relative_import_helper(__file__,2)

from .. import A
...

那我就可以在IDLE工作的时候使用亲戚导入了