1

このようなフォルダがあります

/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、またはtest2IDLE にいる間にこれらのインポートが機能するようにしたい場合、つまり、その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
4

1 に答える 1

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 での作業中にrelatives インポートを使用できます。

于 2016-03-14T21:35:09.360 に答える