簡體   English   中英

Python名稱空間包的導入問題

[英]Import problems with Python namespace packages

我正在嘗試使用Python 名稱空間包概念將我的庫拆分到多個目錄中。 通常,它可以工作,但是在將名稱導入到項目包級別時遇到問題。

我的項目結構如下:

示例項目結構

project1/coollibrary/__init__.py

from __future__ import absolute_import

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

from .foomodule import foo

project1/coollibrary/foomodule.py

def foo():
    print ('foo')

project2/coollibrary/__init__.py

from __future__ import absolute_import

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

from .barmodule import bar

project2/coollibrary/barmodule.py

def bar():
    print ('bar')

這兩個項目都在PATH中:

$ echo ${PYTHONPATH}
/home/timo/Desktop/example/project1:/home/timo/Desktop/example/project2

我從這里運行代碼:

$ pwd
/home/timo/Desktop/example
$ python3
>>> import coollibrary
>>> coollibrary.foo() # works
foo
>>> coollibrary.bar() # does not work (the problem)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'bar'
>>> import coollibrary.barmodule 
>>> coollibrary.barmodule.bar() # works
bar

如何修復代碼,以便可以直接從coollibrary包中導入foobar 另外,有沒有一種適用於Python2.7和Python3.4(不需要其他版本)的解決方案。

從Python 3.3開始,您可以使用PEP 420-隱式命名空間包

基本上,您將在兩個存儲庫中都刪除__init__.py文件,並添加:

setup(
    ...
    packages=['coollibrary.{foomodule/barmodule}'],
    namespace_packages=['coollibrary'],
    ...
)

到您的setup.py

雖然無法幫助您使用Python 2.7 ...

暫無
暫無

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

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