toml和cython扩展模块



我有一个现有的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.pypyproject.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(尽管已弃用(

相关内容

  • 没有找到相关文章

最新更新