簡體   English   中英

Python - 如果部署到兩個不同的路徑,則名稱空間沖突

[英]Python - namespace conflict if deployed to two different paths

我有一個頂級命名空間,就像一個組織命名空間。 讓我們來命名myorg ,它的__init__.py看起來像這樣:

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

這部署在我們的Python所在的/opt下,以及一些開發的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; DR

我的預期行為或我希望的是:

  • /opt/搜索模塊
  • 如果沒有找到其他例如/bb/bin

這適用於第一種情況,但似乎myorg已從/opt導入,那么它只在那里尋找模塊。

那是因為“myorg”已經加載 - python只加載模塊/包一次。 如果你首先加載myorg(來自/ opt)(或者任何子模塊,因為Python加載導入的所有“步驟”),那么任何myorg.something都將相對於那個。

你能嘗試import as嗎? PEP描述它

如果我理解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 這很丑,但應該有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM