这迫使您保留一个foo
目录,但是我认为这是使它生效的最佳方法。
目录设置:
bar
├── __init__.py
└── baz.py
foo
└── __init__.py
foo_bar.py
bar/__init__.py
是空的。
bar/baz.py
:worked = True
foo/__init__.py
:
import sys
# make sure bar is in sys.modules
import bar
# link this module to bar
sys.modules[__name__] = sys.modules['bar']
# Or simply
sys.modules[__name__] = __import__('bar')
foo_bar.py
:
import foo.baz
assert(hasattr(foo, 'baz') and hasattr(foo.baz, 'worked'))
assert(foo.baz.worked)
import bar
assert(foo is bar)
它不能正常工作。如果模块具有子模块,则它们是不同的。
对于包含子模块的可靠解决方案,您还需要将每个子模块的别名显式添加到sys.modules中。这行得通(我已经在Python 3.6 / 3.7上尝试过了,所以甚至在最新版本中也都尝试过),并成功避免了细微的错误,最终您以相同名称的同一模块的多个实例结束(如果您使用每个模块,可能会引起噩梦)静态状态或isinstance()检查,如果同一个类的多个版本使用不同的名称,则会感到困惑)。比MetaPathFinder方法更有效。