setup(name)和Extension(name)

时间:2019-01-16 14:14:42

标签: python distutils

我正在编写(实际生成)一个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之间的关系是什么,尤其是在以下方面:

  • 彼此
  • 用于在使用扩展名的Python脚本中导入扩展名的名称
  • 生成的.pyd(或.so)文件的名称

我在distutils的文档中阅读了此内容:

  • Abc是“包裹名称”
  • Xyz是“扩展名的全名,包括所有软件包-即不是文件名或路径名,而是Python点分名称”

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

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

1 个答案:

答案 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.Templatefrom Cheetah import Template;这意味着我有一个目录cheetah3/Cheetah/

该库具有an extension _namemapperExtension()中使用的名称为Cheetah._namemapper