setup(name) 和 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 是“包名”

  • Xyz 是“扩展的全名,包括任何包——即不是文件名或路径名,而是 Python 点名”

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

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


倚天杖
浏览 180回答 1
1回答

慕桂英3389331

最大的误解来源是“包”这个词被重载了。游戏中有 4 个不同的名称——用于开发的目录名称(包含setup.py的目录名称)、包含的目录名称__init__.py和其他可导入模块的名称、PyPI 中的分发名称以及扩展名。通常前 3 个相同或相似,但这不是必需的。开发目录的名字可以是任意的,它的名字没有任何作用。当然,正确命名它很方便,但这只是方便。包含 Python 文件的目录名称命名要导入的包。一旦包被命名为导入,名称通常会被卡住并且无法更改。发行版的名称在 PyPI 上给出了一页和发行版文件的名称(源发行版、鸡蛋、轮子)。这是人们setup(name='distribution')呼唤的名字。扩展是 python 模块,因此扩展的名称必须是正确的模块名称。但是输入的名称Extension()必须是模块的完整 python 路径,包括顶级包名称。在你的例子中是Extension(&nbsp; name = 'Abc.Xyz',&nbsp; sources = ['a.cpp', 'b.cpp'])这会产生一个可以导入为的扩展&nbsp; import Abc.Xyz或者&nbsp; from Abc import Xyz或者&nbsp; from Abc.Xyz import <internal name>让我展示详细的真实例子。我一直在维护一个名为CheetahTemplate的模板库。我在名为cheetah3/. PyPI 的发行版称为Cheetah3;这是我输入的名字setup(name='Cheetah3')。因此,顶级模块是Cheetah一个 doimport Cheetah.Template或from Cheetah import Template; 这意味着我有一个目录cheetah3/Cheetah/。图书馆有一个扩展名_namemapper。中使用的名称Extension()是Cheetah._namemapper。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python