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

时间:2016-03-07 22:54:57

标签: python python-2.7 python-3.x import relative-import

我有一个像这样的文件夹

/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状态时工作,即如果我在F5工作时按test2每项工作都很好,因为我不想做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

1 个答案:

答案 0 :(得分:0)

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

#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

我用

#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工作时使用亲戚导入。