Как создать py3-none-any колеса для проекта с дополнительным расширением C?

#python #cython #setuptools #python-wheel #python-extensions

#python #cython #setuptools #python-колесо #python-расширения

Вопрос:

msgpack включает в себя дополнительное расширение cython. Некоторым пользователям пакета нужны py3-none-any колеса msgpack. Я пытаюсь выяснить, как сделать возможным создание колес как с дополнительным расширением, так и без него.

Ответ №1:

Одним из возможных решений является использование переменной среды в setup.py , чтобы решить, следует ли устанавливать ext_modules пустой список из списка setuptools.Extension

pyproject.toml

 [build-system]
requires = ["setuptools", "wheel", "cython"]
build-backend = "setuptools.build_meta"
 

setup.py

 from setuptools import setup, Extension
import os

if 'ONLY_PURE' in os.environ:
    ext_modules = []
else:
    module1 = Extension('helloworld', sources = ['helloworld.pyx'])
    ext_modules = [module1]
setup(ext_modules=ext_modules)
 

setup.cfg

 [metadata]
name = mypackage
version = 0.0.1

[options]
py_modules = mypackage
 

mypackage.py

 try:
    import helloworld
except ImportError:
    print('hello pure python')
 

helloworld.pyx

 print("hello extension")
 

Для сборки с расширением:

 $ pip install build
...
$ python -m build
...
$ ls dist/
mypackage-0.0.1-cp39-cp39-linux_x86_64.whl  mypackage-0.0.1.tar.gz
 

Для сборки без расширения

 $ pip install build
...
$ ONLY_PURE='a nonempty string' python -m build
...
$ ls dist/
mypackage-0.0.1-py3-none-any.whl  mypackage-0.0.1.tar.gz
 

Комментарии:

1. Каков результат pip install mypackage-0.0.1-py3-none-any.whl ? Я не понимаю, как pip установить колесо, для которого требуется расширение без указанного расширения.

2.При запуске pip install mypackage-0.0.1-py3-none-any.whl . pip устанавливается только mypackage.py потому, что (в отличие mypackage-0.0.1-cp39-cp39-linux_x86_64.whl от) mypackage-0.0.1-py3-none-any.whl не содержит необязательного helloworld расширения. При mypackage.py попытке импортировать helloworld ImportError выбрасывается и mypackage.py возвращается к печати «привет, чистый python»

3. Необязательное расширение. Хорошо, я понял, спасибо! У меня есть дополнительное расширение в одном из моих пакетов, но я не предоставляю колесо без него. Либо двоичные диски , либо дистрибутив исходного кода. Причина наличия колеса с чистым исходным кодом без расширения неясна. Разве недостаточно опубликовать sdist (.tar.gz )?