导入Python命名空间包的问题

时间:2015-05-06 14:21:28

标签: python import namespace-package

我正在尝试使用Python namespace packages concept将我的库拆分到多个目录中。一般情况下,它有效,但我有一个问题,就是将名称导入项目包级别。

我的项目结构如下:

Example project structure

  

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

如何修复代码,以便我可以直接从foo包导入barcoollibrary。此外,是否有适用于Python2.7和Python3.4的解决方案(不需要其他版本)。

1 个答案:

答案 0 :(得分:0)

从Python 3.3开始,您可以使用PEP 420 -- Implicit Namespace Packages

基本上,您将删除两个存储库中的angular.module('sampleApp')['_invokeQueue'].forEach(function(value){ console.log(value[1] + ": " + value[2][0]); }) 文件,并添加:

__init__.py

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

无法帮助您使用Python 2.7但是......