Какая связь между настройкой (имя) и расширением (имя) - PullRequest
0 голосов
/ 16 января 2019

Я пишу (на самом деле генерирую) скрипт setup.py для создания одного расширения Python с несколькими источниками C ++. Мне неясно, какова связь между именем, указанным в качестве параметра 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 Ответ

0 голосов
/ 16 января 2019

Самым большим источником недоразумений является то, что слово «пакет» сильно перегружено. В игре есть 4 разных имени - имя каталога, используемого для разработки (содержащего setup.py), имя каталога, содержащего __init__.py и других импортируемых модулей, имя дистрибутива в PyPI и Название расширения. Довольно часто первые 3 одинаковы или похожи, но это не обязательно.

Имя каталога разработки может быть любым, его имя не играет никакой роли. Конечно, это правильно назвать, но это только удобство.

Имя каталога с файлами Python указывает на импортируемый пакет. Как только пакет назван для импорта, имя обычно застревает и не может быть изменено.

Название дистрибутива дает одну страницу в PyPI и название дистрибутивных файлов (исходный дистрибутив, яйца, колёса). Это имя, которое вставляют в setup(name='distribution') вызов.

Расширения - это модули Python, поэтому имя расширения должно быть правильным именем модуля. Но имя, которое вы вводите в Extension(), должно быть полным путевым путём к модулю, включая имя пакета верхнего уровня. В вашем примере это

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/.

Библиотека имеет расширение _namemapper. Имя, используемое в Extension(): Cheetah._namemapper.

...