所以我有两个不同的包裹。第一个是我的主软件包“ 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”,而不会覆盖“ bobzilla.structure”。

注意:

设置“此问题可能已经在这里有了答案”的人是错误的。我已经尝试过了,但是没有用。这是两个不同的程序包,而不是相同的程序包。

最佳答案

似乎您在尝试创建名称空间包而不创建名称空间包,这将无法正常工作。

要将包显式指定为名称空间包,您需要使用pkgutil库(或setuptools中更奇特的东西),在bobzilla/__init__.py的顶部类似以下内容:

__path__ = pkgutil.extend_path(__path__, __name__)


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

关于python - Python-如何从扩展 namespace 导入父包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20911929/

10-11 17:27