gpt4 book ai didi

python - 如何导入需要调整 sys.path 的命名空间包?

转载 作者:行者123 更新时间:2023-11-28 16:49:16 24 4
gpt4 key购买 nike

在我正在开发的 python 应用程序中,我想根据运行时提供的信息(例如从配置文件)动态加载包(插件)。

因此,我更改了 sys.path 以添加到我要加载的插件的路径,这通常工作正常,但如果插件是已初始化的命名空间内的命名空间包(我认为这就是问题所在)无论如何)。

例子:

# lib1 contains plugins/__init__.py and plugins/foo/__init__.py
# lib2 contains plugins/__init__.py and plugins/bar/__init__.py
# plugins is a namespace package

import sys

sys.path.append ('lib1')
import plugins.foo

sys.path.append ('lib2')
import plugins.bar

上面的代码因 ImportError 而失败,大概是因为“import plugins.foo”行初始化了插件命名空间/包,并且没有进一步尝试在 sys.path 中搜索命名空间中的其他包。

如果我把代码改成这样:

sys.path.append ('lib1')
sys.path.append ('lib2')
import plugins.foo
import plugins.bar

两个导入都有效,但我想在 plugins.foo 导入之后添加到 sys.path。

所以,我的问题是:

  1. 我的假设是否正确,因为第二次导入失败是因为命名空间包?
  2. 有变通办法吗?

最佳答案

我认为您的诊断是正确的。当您导入 plugins.foo 时,python 还会加载 plugins 并将其缓存在 sys.modules 中。我没有复制您的设置,但我会在您导入 bar 之前尝试 del sys.modules['plugins']。如果这不起作用,请尝试重新加载 plugins:

sys.path.append ('lib2')
import plugins
reload(plugins)
import plugins.bar

我必须承认,一般来说,重新加载并不是运行程序的好主意。 “正确”的解决方案是找出一个工作流程,让您在开始从包导入之前设置完整的 sys.path。或者也许不要将一个包裹分散到不同的地方。

关于python - 如何导入需要调整 sys.path 的命名空间包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9758753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com