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']
)
]
)
Abc
和 Xyz
之间有什么关系,特别是关于:
- 彼此
- 将用于在使用它的 Python 脚本中导入扩展的名称
- 生成的
.pyd
(或.so
)文件的名称
我在 distutils
的文档中读到这个:
Abc
是 "The name of the package"
Xyz
是 "the full name of the extension, including any packages — ie. not a filename or pathname, but Python dotted name"
不幸的是,我无法从中解读我的答案(可能是因为 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.Template
或 from Cheetah import Template
;这意味着我有一个目录 cheetah3/Cheetah/
.
图书馆有 an extension _namemapper
. The name used in Extension()
is Cheetah._namemapper
.
我正在编写(实际上是生成)一个 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']
)
]
)
Abc
和 Xyz
之间有什么关系,特别是关于:
- 彼此
- 将用于在使用它的 Python 脚本中导入扩展的名称
- 生成的
.pyd
(或.so
)文件的名称
我在 distutils
的文档中读到这个:
Abc
是 "The name of the package"Xyz
是 "the full name of the extension, including any packages — ie. not a filename or pathname, but Python dotted name"
不幸的是,我无法从中解读我的答案(可能是因为 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.Template
或 from Cheetah import Template
;这意味着我有一个目录 cheetah3/Cheetah/
.
图书馆有 an extension _namemapper
. The name used in Extension()
is Cheetah._namemapper
.