用Cython组织包

6 投票
1 回答
1023 浏览
提问于 2025-04-18 14:32

我有一个需要用Cython来构建扩展的包,我正在尝试调整一下setup.py文件,以简化安装过程。

一个简单的

pip install git+git://<pkg-repo> 

会报错

$ pip install git+https://<pkg-repo>
Downloading/unpacking git+https://<pkg-repo>
  Cloning https://<pkg-repo> to /tmp/pip-nFKHOM-build
  Running setup.py (path:/tmp/pip-nFKHOM-build/setup.py) egg_info for package from git+https://<pkg-repo>
    Traceback (most recent call last):
      File "<string>", line 17, in <module>
      File "/tmp/pip-nFKHOM-build/setup.py", line 2, in <module>
        from Cython.Build import cythonize
    ImportError: No module named Cython.Build
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):

  File "<string>", line 17, in <module>

  File "/tmp/pip-nFKHOM-build/setup.py", line 2, in <module>

    from Cython.Build import cythonize

ImportError: No module named Cython.Build

因为在安装Cython依赖之前就尝试导入Cython。这导致了一个多阶段的安装过程:

pip install <deps> cython
pip install git+git://<pkg-repo>

这真让人头疼。setup.py文件中相关的部分是:

from setuptools import setup, find_packages
from Cython.Build import cythonize

setup(
    install_requires=[
        ...
        'cython>=0.19.1'
        ...
    ],
    ext_modules=cythonize([
        ...
        "pkg/io/const.pyx",
        ...
    ])
)

我该如何修改setup.py,在依赖install_requires来获取Cython的同时,仍然能够对ext_modules进行cythonize处理呢?

1 个回答

3

从18.0版本开始,setuptools支持Cython了。你只需要在setup_requires中指定Cython的版本,并在Extension中列出需要的源文件,setuptools会自动使用Cython来构建这些文件,并在需要时安装它。这样,你就不需要在setup.py中手动调用cythonize()了。

你的setup.py文件可以这样写:

from setuptools import setup, Extension

setup(
    setup_requires=[
        ...
        'setuptools>=18.0',
        'cython>=0.19.1',
        ...
    ],
    ext_modules=Extension([
        ...
        "pkg/io/const.pyx",
        ...
    ])
)

我之前也不知道这个功能,直到在一个StackOverflow的回答中看到提到这个:https://stackoverflow.com/a/38057196/1509394

撰写回答