我有一个现有的python项目,该项目主要使用setup.py
来构建该项目。该项目在setup.py.中配置了2个Cython扩展模块
最初,我使用pip install -e .
进行开发,但从那时起,我只在需要时使用python setup.py build_ext --inplace
重建扩展。这比安装软件包要快得多。
我开始将项目迁移到pyproject.toml
,包括pyproject.toml
中[project]
部分中的项目配置
我的setup.py
基本上只包含Cython扩展模块,据我所知,到目前为止还不能迁移到"pyproject.toml"。
现在我的问题是:python setup.py build_ext --inplace
不再工作,因为setup.py
没有所有的信息,并且没有咨询pyproject.toml
来读取项目配置(因此项目配置信息丢失(。
我需要恢复到原始的setup.py/*.cfg-config吗?或者有没有办法告诉setup.py
从pyproject.toml
检索配置?
下面是一个使用pyproject.toml
构建文本的小技巧示例
pyproject.toml
[tool.setuptools]
py-modules = ["_custom_build"]
[tool.setuptools.cmdclass]
build_py = "_custom_build.build_py"
_custom_build.py
from setuptools import Extension
from setuptools.command.build_py import build_py as _build_py
class build_py(_build_py):
def run(self):
self.run_command("build_ext")
return super().run()
def initialize_options(self):
super().initialize_options()
if self.distribution.ext_modules == None:
self.distribution.ext_modules = []
self.distribution.ext_modules.append(
Extension(
"termial_random.random",
sources=["termial_random/random.c"],
extra_compile_args=["-std=c17", "-lm"],
)
)
对我来说,它正在按照Cython文档和setuptools文档中的建议进行工作。
在requires
列表中添加cython
作为依赖项,是我对pyproject.toml
所做的唯一更改。
以下是setup.py
:的内容
from setuptools import setup, Extension
from Cython.Build import cythonize
from Cython.Compiler import Options
import numpy
# These are optional
Options.docstrings = True
Options.annotate = False
# Modules to be compiled and include_dirs when necessary
extensions = [
# Extension(
# "pyctmctree.inpyranoid_c",
# ["src/pyctmctree/inpyranoid_c.pyx"],
# ),
Extension(
"pyctmctree.domortho",
["src/pyctmctree/domortho.pyx"], include_dirs=[numpy.get_include()],
),
]
# This is the function that is executed
setup(
name='mypackage', # Required
# A list of compiler Directives is available at
# https://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html#compiler-directives
# external to be compiled
ext_modules = cythonize(extensions, compiler_directives={"language_level": 3, "profile": False}),
)
Note
:get_include
仅当您使用numpy的c版本时才需要。
一旦创建了setup.py
,我就可以使用pip install -e .
编译Cython扩展(在项目目录中(。
到目前为止,我注意到在使用pip install -e .
:时有以下两个缺点
- 每次都会检查所需的包裹
- 无论时间戳如何,都会生成每个
.pyx
文件
上述情况大大减缓了发展。
更快的替代品是:
python3 setup.py build_ext -i
python3 setup.py develop
(尽管已弃用(