setup(name) 和 Extension(name) 之间的关系是什么

What is the relationship between setup(name) and Extension(name)

我正在编写(实际上是生成)一个 setup.py 脚本,用于使用多个 C++ 源构建单个 Python 扩展。我不清楚指定为 name 参数到 distutils.core.setup 的名称与指定为 name 参数到 distutils.core.Extension 的名称之间的关系是什么。所以当我有这个时:

distutils.core.setup(
  name = 'Abc',
  ext_modules = [
    distutils.core.Extension(
      name = 'Xyz',
      sources = ['a.cpp', 'b.cpp']
    )
  ]
)

AbcXyz 之间有什么关系,特别是关于:

我在 distutils 的文档中读到这个:

不幸的是,我无法从中解读我的答案(可能是因为 Python 不是我的主要语言,我只是偶尔使用它)。

如果相关,上下文是我正在创建一个 CMake 包装器以将构建 Python 扩展合并到我项目的 CMake 框架中。

最大的误解来源是 "package" 这个词被重载了。游戏中有 4 个不同的名称 — 用于开发的目录名称(包含 setup.py 的目录名称)、包含 __init__.py 和其他可导入模块的目录名称、分发名称在 PyPI,以及扩展的名称。通常前 3 个相同或相似,但这不是必需的。

开发目录的名字可以随便起,它的名字没有任何作用。取个好名字固然方便,但这只是方便而已。

包含 Python 个文件的目录名称是要导入的包的名称。一旦为导入包命名,名称通常会卡住并且无法更改。

发行版的名称给出了 PyPI 的一页和发行版文件的名称(源发行版、eggs、wheels)。这是在 setup(name='distribution') 电话中输入的名字。

扩展是 python 模块,因此扩展的名称必须是正确的模块名称。但是 Extension() 中的名称必须是包含顶级包名称的模块的完整 python 路径。在你的例子中是

Extension(
  name = 'Abc.Xyz',
  sources = ['a.cpp', 'b.cpp']
)

这会生成一个可以导入的扩展

  import Abc.Xyz

  from Abc import Xyz

  from Abc.Xyz import <internal name>

让我展示详细的实例。我一直在维护一个名为 CheetahTemplate. I develop it in the development directory called cheetah3/. The distribution at PyPI is called Cheetah3; this is the name I put into setup(name='Cheetah3'). The top-level module is Cheetah 的模板库,因此有人使用 import Cheetah.Templatefrom Cheetah import Template;这意味着我有一个目录 cheetah3/Cheetah/.

图书馆有 an extension _namemapper. The name used in Extension() is Cheetah._namemapper.