2017-10-11 69 views
0

我有一個大型的圖書館,我想拆分它。有包: hdx.data hdx.facades hdx.utilities使用相同的基本軟件包名稱導入軟件包

我想hdx.utilities移動到一個單獨的項目HDX-python的公用事業(PyPI上),然後將其作爲一項要求與包hdx.data添加到項目和hdx.facades(hdx-python-api)。問題是,在項目hdx-python-api中執行from hdx.utilities.session import get_session時,我得到ImportError: No module named 'hdx.utilities'

是否有任何方法可以在Python 3+和2.7(無需在其中任何一箇中重命名頂級程序包名稱hdx)中同時使這項工作同時允許hdx-python-api和hdx-python-utilities在任何項目,安裝它們?

+0

你爲什麼要將它分離出來才能滿足它的要求? –

+0

因此,它包含的實用程序可以用於其他項目(不導入hdx-python-api) – mcarans

+0

您可能必須*安裝*'hdx-python-api',但不會導入*。 –

回答

1

There are three ways of doing namespaced packages

  • 天然(Python的3.3)
  • pkgutil式(Python 2和3,對於天然兼容)
  • 通過pkg_resources式(不相容除上述之外,不推薦使用,不推薦)

做包命名空間爲Python 2推薦的方式和3 pkgutil-style namespace packages

您將創建hpx-python-api

setup.py 
hpx/ 
    __init__.py  # namespace init, see content below 
    data/ 
     __init__.py 
     ... 
    facades/ 
     __init__.py 
     ... 

以下和hpx-python-utilities

setup.py 
hpx/ 
    __init__.py  # namespace init, see content below 
    utilities/ 
     __init__.py 
     ... 

以下兩個__init__.py文件的命名空間包只需要包含以下內容:

__path__ = __import__('pkgutil').extend_path(__path__, __name__) 
+0

Thx很多。很有幫助! – mcarans

+0

如果仍然出現導入錯誤,我發現您需要重新創建virtualenv(即使您已將軟件包更新爲正確的版本)。 – mcarans

+0

另外,如果你想在兩個項目中使用任何子包名(例如,在兩個項目中創建'hdx.utilities'),那麼子包中的__init __。py'也必須包含'__path__'行(如'__init__。 py'在基礎包中,例如'hdx')。 – mcarans

相關問題