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

3 投票
2 回答
1901 浏览
提问于 2025-04-16 20:47

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

project/
|
+--root/
   |
   +--__init__.py
   |
   +--sub/
      |
      +--__init__.py
      |
      +--actualcode.py

我想使用“命名空间包”,这样我的库就可以和其他相关的库共享一个公共的命名空间,且这些库可能在不同的项目中。导入语句应该像这样:

from root.sub.actualcode import something

根文件夹中的__init__.py文件包含以下语句,用来创建一个命名空间包:

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

但是当我导入root.sub时,无法引用代码。只有当我这样写时,它才有效:

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

我该怎么做才能把root当作一个命名空间使用呢?

2 个回答

-1

我刚刚试了你的例子,但看起来它的工作方式和你想的一样:

    >>> from root.sub.actualcode import foo
    >>> foo()
    Bar!

我从包含root文件夹的目录运行了Python解释器。我创建了空的__init__.py文件,而我的actualcode.py看起来是这样的:

    #!/bin/python3

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

不同之处在于我的__init__.py文件是空的。

0

命名空间包可以通过 distribute 来创建。诀窍是要在 setup 的参数中添加以下这一行:

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

问题中的其他示例是正确的。

撰写回答