如何在Python中创建命名空间包?

如何在Python中创建命名空间包?,python,namespaces,package,distutils,Python,Namespaces,Package,Distutils,我有一个Python 3项目,其结构如下: project/ | +--root/ | +--__init__.py | +--sub/ | +--__init__.py | +--actualcode.py 我希望使用“名称空间包”,以便我的lib与单独项目中的其他相关lib共享一个公共名称空间。导入语句应如下所示: from root.sub.actualcode import something #!/bi

我有一个Python 3项目,其结构如下:

project/
|
+--root/
   |
   +--__init__.py
   |
   +--sub/
      |
      +--__init__.py
      |
      +--actualcode.py
我希望使用“名称空间包”,以便我的lib与单独项目中的其他相关lib共享一个公共名称空间。导入语句应如下所示:

from root.sub.actualcode import something
    #!/bin/python3

    def foo():
        print("Bar!")
根文件夹中的
\uuuuu init\uuuuuuuu.py
文件包含以下创建命名空间包的语句:

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
但是我在导入
root.sub
时无法引用代码。只有当我写下:

from sub.actualcode import something # doesn't work with "root.sub..."!

如何使用
根目录
作为名称空间?

我刚刚尝试了您的示例,但它的工作方式似乎与您希望的一样:

    >>> from root.sub.actualcode import foo
    >>> foo()
    Bar!
我从包含
root
文件夹的目录运行Python解释器。我创建了空的
\uuuu init\uuuuuuuupy
文件,我的
actualcode.py
如下所示:

from root.sub.actualcode import something
    #!/bin/python3

    def foo():
        print("Bar!")

不同之处在于我的
\uuuu init\uuuuy.py
文件是空的。

我刚刚尝试了您的示例,但它的工作方式似乎与您希望的一样:

    >>> from root.sub.actualcode import foo
    >>> foo()
    Bar!
我从包含
root
文件夹的目录运行Python解释器。我创建了空的
\uuuu init\uuuuuuuupy
文件,我的
actualcode.py
如下所示:

from root.sub.actualcode import something
    #!/bin/python3

    def foo():
        print("Bar!")

不同之处在于我的
\uuuu init\uuuu.py
文件是空的。

命名空间包可以使用构建。诀窍是在
设置的参数中添加以下行:

setup(
  # ...
  namespace_packages  = ["root"]
)

问题中示例的其余部分是正确的。

命名空间包可以使用构建。诀窍是在
设置的参数中添加以下行:

setup(
  # ...
  namespace_packages  = ["root"]
)

问题中示例的其余部分是正确的。

在包的setup.py中正确定义了名称空间吗?distutils没有在setup.py中配置名称空间的权限。没有人关心distutils。setuptools或distribute是got@Sentinel谢谢你的提示。遵循distutils文档应该可以工作,但分发可能更好。它有直接的名称空间是否在包的setup.py中正确定义?distutils没有在setup.py中配置名称空间的权限。没有人关心distutils。setuptools或distribute是got@Sentinel谢谢你的提示。遵循distutils文档应该可以工作,但分发可能更好。它具有直接的名称空间,但不适用于具有相同根名称空间的另一个项目。好的,因此此解决方案适用于此处发布的案例,但不是您试图找到的一般解决方案。重要的细节是“名称空间包”。但这不适用于具有相同根名称空间的另一个项目。好的,因此,此解决方案适用于此处发布的案例,但不是您试图找到的一般解决方案。重要的细节是“名称空间包”。