![](/img/trans.png)
[英]Will python add name in packages namespace with from * import *?
[英]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
包中导入foo
和bar
。 另外,有没有一种适用于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.