如何在不执行 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
我想像这样在 test1
和 test2
中使用亲戚导入
#test1.py
from . import A
from .sub_mod import B
...
#test2.py
from .. import A
from . import B
...
当我开发 test1
或 test2
时,我希望这些导入在我处于 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工作的时候使用亲戚导入了
我有一个这样的文件夹
/test_mod
__init__.py
A.py
test1.py
/sub_mod
__init__.py
B.py
test2.py
我想像这样在 test1
和 test2
中使用亲戚导入
#test1.py
from . import A
from .sub_mod import B
...
#test2.py
from .. import A
from . import B
...
当我开发 test1
或 test2
时,我希望这些导入在我处于 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工作的时候使用亲戚导入了