[英]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.