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

2024-09-28 18:58:51 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有两个不同的包裹。第一个是我的主包“bobzilla”,另一个包扩展了第一个bobzilla.结构". 在

bobzilla/
  __init__.py

其中bobzilla/\uu init_u.py包含:

^{pr2}$

以及:

bobzilla/
  __init__.py
  structure/
    __init__.py

其中bobzilla/structure/\uyu init\uy.py包含:

import bobzilla
foo=Foo("bar")

当执行bobzilla/structure/\uu init_uu.py时,我得到:

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

我的问题是,如何引用名称空间“bobzilla”frombobzilla.结构“没有”bobzilla.结构“重写它。在

注意:

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


Tags: pyimportfooinitbarstructure结构attributeerror
3条回答

bobzilla/structure/__init__.py应该是:

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

使用相同的结构和问题中提到的代码来测试上述内容。bobzilla正在/path/to/test。结果:

^{pr2}$

尝试:

import bozilla.structure as struct
import bozilla

一个使用NLTKhttp://nltk.org的工作示例:

^{pr2}$

看起来你试图在不创建命名空间包的情况下创建一个命名空间包,这……是行不通的。在

要显式地将一个包指定为名称空间包,您需要使用^{}库(或{}中更花哨的东西),类似于{}顶部的内容:

__path__ = pkgutil.extend_path(__path__, __name__)

如果您想要一个implicit namespace package,那么可以在python3.3及更高版本中实现……但前提是bobzilla空的。隐式命名空间包不能包含__init__.py文件,并且除了它们的模块之外,永远不会有任何内容。(好吧,您可以创建一个隐式命名空间包,然后添加一个子包或外部模块,在创建后显式地向其中添加内容…但我不确定您为什么要这样做。)

相关问题 更多 >