如何将Cython与诗歌结合使用?

2024-06-26 07:40:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我的项目中有一个文件,出于性能原因,我想编译该文件:

mylibrary/myfile.py

如何通过诗歌来实现这一点


Tags: 文件项目py原因性能myfile诗歌mylibrary
1条回答
网友
1楼 · 发布于 2024-06-26 07:40:54

诗歌中有一个未记载的特征。将此添加到您的pyproject.toml

[tool.poetry]
...
build = 'build.py'

[build-system]
requires = ["poetry>=0.12", "cython"]
build-backend = "poetry.masonry.api"

这样做的目的是在隐式生成的setup.py中运行build.py:build()函数。 这是我们建造的地方

因此,创建一个提供build()函数的build.py

import os

# See if Cython is installed
try:
    from Cython.Build import cythonize
# Do nothing if Cython is not available
except ImportError:
    # Got to provide this function. Otherwise, poetry will fail
    def build(setup_kwargs):
        pass
# Cython is installed. Compile
else:
    from setuptools import Extension
    from setuptools.dist import Distribution
    from distutils.command.build_ext import build_ext

    # This function will be executed in setup.py:
    def build(setup_kwargs):
        # The file you want to compile
        extensions = [
            "mylibrary/myfile.py"
        ]

        # gcc arguments hack: enable optimizations
        os.environ['CFLAGS'] = '-O3'

        # Build
        setup_kwargs.update({
            'ext_modules': cythonize(
                extensions,
                language_level=3,
                compiler_directives={'linetrace': True},
            ),
            'cmdclass': {'build_ext': build_ext}
        })

现在,当您执行poetry build时,什么都不会发生。 但是如果你在别处安装这个包,它就会被编译

您还可以使用以下工具手动构建它:

$ cythonize -X language_level=3 -a -i mylibrary/myfile.py

最后,您似乎无法将二进制软件包发布到PyPi。 解决方案是将构建限制为“sdist”:

$ poetry build -f sdist
$ poetry publish

相关问题 更多 >