如何为具有可选 C 扩展的项目构建 py3-none-any wheels?
How to build py3-none-any wheels for a project with an optional C extension?
msgpack 包括一个可选的 cython
延期。 Some users of the package want py3-none-any wheels of msgpack。我想弄清楚如何制作
可以在有和没有可选扩展的情况下构建轮子。
一个可能的解决方案是使用 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
msgpack 包括一个可选的 cython 延期。 Some users of the package want py3-none-any wheels of msgpack。我想弄清楚如何制作 可以在有和没有可选扩展的情况下构建轮子。
一个可能的解决方案是使用 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