我正在编写(实际生成)一个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
之间的关系是什么,尤其是在以下方面:
.pyd
(或.so
)文件的名称我在distutils
的文档中阅读了此内容:
Abc
是“包裹名称” Xyz
是“扩展名的全名,包括所有软件包-即不是文件名或路径名,而是Python点分名称” 不幸的是,我无法从中解译我的答案(可能是因为Python不是我的主要语言,我只是偶尔使用它)。
在相关的情况下,上下文是我正在创建CMake包装器,以将构建的Python扩展合并到项目的CMake框架中。
答案 0 :(得分:1)
造成误解的最大原因是“包裹”一词的重载。游戏中有4种不同的名称-用于开发的目录名称(包含setup.py
的目录名称,包含__init__.py
和其他可导入模块的目录名称,发行名称在PyPI,以及扩展名。前三个经常是相同或相似的,但这不是必需的。
开发目录的名称可以是任何名称,它的名称不起作用。当然,正确命名是很方便的,但这只是方便。
带有Python文件的目录名称为要导入的包命名。将包命名为要导入后,该名称通常会停留并且无法更改。
分发的名称在PyPI上显示一页,并且分发文件的名称(源分发,鸡蛋,转盘)。这是人们在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的模板库。我在名为cheetah3/
的开发目录中进行开发。 PyPI上的分布称为Cheetah3;这就是我在setup(name='Cheetah3')
中输入的名称。顶层模块是Cheetah
,因此一个模块是import Cheetah.Template
或from Cheetah import Template
;这意味着我有一个目录cheetah3/Cheetah/
。
该库具有an extension _namemapper
。 Extension()
中使用的名称为Cheetah._namemapper
。