#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 )?