Python - 如何从扩展名称空间导入父包

时间:2014-01-03 20:13:14

标签: python namespaces packages extend

所以我有两个不同的包。第一个是我的主程序包“bobzilla”,另一个包扩展了第一个“bobzilla.structure”。

bobzilla/
  __init__.py

bobzilla / __ init__.py包含:

class Foo(object):
    def __init__(self, bar):
        self.bar=bar

bobzilla/
  __init__.py
  structure/
    __init__.py

bobzilla / structure / __ init__.py包含:

import bobzilla
foo=Foo("bar")

执行bobzilla / structure / __ init__.py时,我得到:

AttributeError: 'module' object has no attribute 'Foo'

我的问题是,如何在没有“bobzilla.structure”覆盖的情况下从“bobzilla.structure”引用命名空间“bobzilla”。

注意:

设置“这个问题的人可能已经在这里找到答案”是错误的。我已经尝试过了,但它没有用。这是两个不同的包,不一样。

3 个答案:

答案 0 :(得分:1)

看起来你正在尝试创建一个命名空间包而不创建一个命名空间包,但是...不会起作用。

要明确地将包指定为命名空间包,您需要使用pkgutil库(或setuptools中的发烧友的东西),如bobzilla/__init__.py顶部的那样:

__path__ = pkgutil.extend_path(__path__, __name__)

如果您需要implicit namespace package,可以在Python 3.3及更高版本中执行此操作...但仅当bobzilla 为空时。隐式命名空间包不能包含__init__.py文件,并且除了模块之外永远不会有任何内容。 (好吧,你可以创建一个隐式的命名空间包,然后添加一个子包或外部模块,一旦它被创建就显式添加到它中......但我不确定你为什么这样做。)

答案 1 :(得分:0)

bobzilla/structure/__init__.py应该是:

from bobzilla import Foo
foo=Foo("bar")

在问题中使用相同的结构和代码进行测试。 bobzilla位于/path/to/test。结果:

>>> from site import addsitedir
>>> addsitedir("/path/to/test")
>>> import bobzilla.structure as struc
>>> struc.foo
<bobzilla.Foo object at 0x7f2f8c716810>
>>> 

答案 2 :(得分:0)

尝试:

import bozilla.structure as struct
import bozilla

NLTK库的工作示例http://nltk.org

>>> import nltk.corpus as corpus
>>> nltk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'nltk' is not defined
>>> import nltk
>>> nltk.corpus
<LazyModule 'nltk.corpus'>
>>> corpus
<LazyModule 'nltk.corpus'>