Самым большим источником недоразумений является то, что слово «пакет» сильно перегружено. В игре есть 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
.