为了账号安全,请及时绑定邮箱和手机立即绑定

setup(name) 和 Extension(name) 的关系是什么

setup(name) 和 Extension(name) 的关系是什么

倚天杖 2021-10-12 16:13:20
我正在编写(实际上是生成)一个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 框架中。
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

最大的误解来源是“包”这个词被重载了。游戏中有 4 个不同的名称——用于开发的目录名称(包含setup.py的目录名称)、包含的目录名称__init__.py和其他可导入模块的名称、PyPI 中的分发名称以及扩展名。通常前 3 个相同或相似,但这不是必需的。


开发目录的名字可以是任意的,它的名字没有任何作用。当然,正确命名它很方便,但这只是方便。


包含 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一个 doimport Cheetah.Template或from Cheetah import Template; 这意味着我有一个目录cheetah3/Cheetah/。


图书馆有一个扩展名_namemapper。中使用的名称Extension()是Cheetah._namemapper。


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信