Python - 如果部署到两个不同的路径,命名空间会发生冲突

标签 python namespaces python-packaging

我有一个顶级命名空间,像组织命名空间一样工作。让我们把它命名为 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/

    相关文章:

    python - Selenium Firefox headless 返回不同的结果

    python - NamedTemporaryFile 存在,但外部程序无法访问它

    php - 无法从其他命名空间加载供应商类

    c++ - 如何使用命名空间和类?

    python - 如果我不是包的原作者,我可以创建包的 PyPI 版本吗?

    包中的 Python 'requirements.txt' 文件

    python - 如何使用 lxml 在 XML 元素名称中使用 ":"?

    python - 如何配置Python Twill/Mechanize库来访问Facebook

    c++ - 命名空间中的私有(private)类

    python - 导入如何在 IPython 中工作