Python包/模块延迟加载子模块

2024-06-02 14:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

今天有趣的用例:我需要在代码更改之后迁移代码库中的模块。旧的mynamespace.Document将消失,我希望通过将此包替换为代码对象来确保平滑的迁移,该对象将动态导入正确的路径并迁移相应的对象。在

简而言之:

# instanciate a dynamic package, but do not load
# statically submodules
mynamespace.Document = SomeObject()
assert 'submodule' not in mynamespace.Document.__dict__

# and later on, when importing it, the submodule
# is built if not already available in __dict__
from namespace.Document.submodule import klass
c = klass()

有几点需要注意:

  • 我说的不仅仅是迁移代码。从某种意义上说,一个简单的巨大的sed就足以更改代码以迁移一些导入,而且我不需要动态模块。我说的是物体。一个网站,包含一些实时/存储的对象将需要迁移。假设mynamespace.Document.submodule.klass存在,这些对象将被加载,这就是动态模块的原因。我需要提供一些东西的网站加载。在
  • 我们不能,或者不想改变对象的取消拾取/加载方式。为了简单起见,让我们假设我们要确保习语from mynamespace.Document.submodule import klass必须工作。我不能用from mynamespace import Document as container; klass = getattr(getattr(container, 'submodule'), 'klass')

我尝试了:

^{pr2}$

如您所见,动态包不起作用。我不明白发生了什么,因为document甚至没有要求ButDynamicPackageDoesNotWork属性。在

有人能解释一下发生了什么事吗?我是否能解决这个问题?在


Tags: 模块对象代码infromimport网站container
1条回答
网友
1楼 · 发布于 2024-06-02 14:33:50

问题是python将绕过sys.modules中的for document中的条目,并直接加载submodule的文件。当然这是不存在的。在

演示:

>>> import multiprocessing
>>> multiprocessing.heap = None
>>> import multiprocessing.heap
>>> multiprocessing.heap
<module 'multiprocessing.heap' from '/usr/lib/python2.6/multiprocessing/heap.pyc'>

我们希望heap仍然是{},因为python可以将其从sys.modules中拉出,但这不会发生。点符号本质上直接映射到{something on python path}/document/submodule.py,并尝试直接加载它。在

更新

诀窍是重写pythons导入系统。下面的代码需要您的DynamicModule类。在

^{pr2}$

相关问题 更多 >