我有一个顶级命名空间,像组织命名空间一样工作。让我们把它命名为 myorg
,它在哪里__init__.py
看起来像这样:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
这是在
/opt
下部署的我们的 Python 所在的位置,以及一些已开发的 Python 库 - 比方说 mylib
.所以在 Python2.7 解释器上这是有效的
>>> import myorg
>>> import myorg.mylib
除了库之外,我们还有一些客户端代码可以部署在系统的其他地方,在
/bb/bin
中。 .例如 clientA
我可以有 :>>> import sys
>>> sys.path.append('/bb/bin')
>>> import clientA
这有效。
然而,由于我们代码的结构,我们共享相同的命名空间
myorg
- 所以 clientB
也在myorg
下并且有一个 /bb/bin/myorg/__init__.py
同样,与 /opt
中的内容相同小路。问题是:
为什么这个有效 -
>>> import sys
>>> sys.path.append('/bb/bin')
>>> import myorg.clientB
但这个没有:
>>> import myorg # import from /opt location
>>> import sys
>>> sys.path.append('/bb/bin')
>>> import myorg.clientB # it should find the module under myorg in /bb/bin
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named clientB
这也不起作用:
>>> import myorg.mylib
>>> import sys
>>> sys.path.insert(0,'/bb/bin') # Adding the /bb/bin path first
>>> import myorg.clientB
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named clientB
所以,就像
myorg
命名空间,如果从 /opt
导入然后它总是会尝试在那里找到模块。这是为什么?有人可以解释如何解决该问题以及为什么会发生这种情况吗?
我也不明白为什么要在前面加上
/bb/bin
到我的路径并没有使它起作用。TL;博士
我的预期行为或我希望的是:
/opt/
中搜索用于模块 /bb/bin
这适用于第一种情况,但似乎是
myorg
已从 /opt
进口然后它只在那里寻找模块。
最佳答案
那是因为“myorg”已经加载了——python 只加载一次模块/包。如果您首先加载 myorg(从/opt)(或任何子模块作为 Python 加载导入的所有“步骤”),那么任何 myorg.something 都将与此相关。
可以试试吗import as
? PEP describing it .
如果我了解 python 的工作原理,这应该可以工作:
import myorg as whateveryouwant # import from /opt location
import sys
sys.path.append('/bb/bin')
import myorg.clientB
编辑:
注意到你的评论它不起作用。 :(
您也可以尝试仅附加
/bb/bin/myorg
然后只导入 clientB
而不是 myorg.clientB
.这很丑陋,但应该有效。
关于Python - 如果部署到两个不同的路径,命名空间会发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56186764/