gpt4 book ai didi

python - setup(name) 和 Extension(name) 之间有什么关系

转载 作者:行者123 更新时间:2023-12-01 08:26:22 25 4
gpt4 key购买 nike

我正在编写(实际上生成)一个 setup.py 脚本,用于使用多个 C++ 源构建单个 Python 扩展。我不清楚指定为 distutils.core.setupname 参数的名称与指定为 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 框架中。

最佳答案

最大的误解来源是“包”这个词的含义过多。游戏中有 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 的模板库。我在名为 cheetah3/ 的开发目录中开发它。 PyPI 上的发行版称为 Cheetah3 ;这是我输入的名字 setup(name='Cheetah3') 。顶层模块是Cheetah因此,可以import Cheetah.Templatefrom Cheetah import Template;这意味着我有一个目录 cheetah3/Cheetah/

图书馆有 an extension _namemapperExtension() 中使用的名称是 Cheetah._namemapper .

关于python - setup(name) 和 Extension(name) 之间有什么关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54218982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com