代码之家  ›  专栏  ›  技术社区  ›  Angew is no longer proud of SO

安装程序(名称)和扩展名(名称)之间的关系是什么?

  •  0
  • Angew is no longer proud of SO  · 技术社区  · 6 年前

    我正在写(实际生成)一个 setup.py 用几个C++源构建单个Python扩展的脚本。我不清楚指定为 name 参数到 distutils.core.setup 以及指定为 名称 参数到 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 回复  |  直到 6 年前
        1
  •  1
  •   phd    6 年前

    最大的误解源于“包”这个词严重超载。游戏中有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 因此一个人 import Cheetah.Template from Cheetah import Template 那意味着我有一个目录 cheetah3/Cheetah/ .

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