Skip to main content
 首页 » 编程设计

python之Cython:控制cythonize停止将编译后的 `.c`文件从 `.pyx`文件放入安装目录

2025年05月04日23unruledboy

我有一个包含敏感代码的小辅助函数 test。为了屏蔽这段代码,我在 hello.pyx 中编写了该函数,并在我的包 mypackage 中使用了它。

我可以通过将包的 setup.py 修改为如下内容来构建和使用它:

import os                                                                                                                                              
from setuptools import setup, find_packages                                                                                                            
from Cython.Build import cythonize                                                                                                                     
os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))                                                                         
 
setup(                                                                                                                                                 
    name='mypackage',                                                                                                                                   
    ext_modules = cythonize('mypackage/hello.pyx'),                                                                                              
    packages=find_packages(),                                                                                                                          
    include_package_data=True,                                                                                                                         
    ) 

但是,当我通过 python setup.py 或 pip install 构建/安装它时,cython 生成了 hello.c 以及hello.so 被放置在安装目录中(在我的例子中是 ~/.local/python2.7/site-packages/mypackage/)

我可以从安装目录中手动删除 hello.c(只留下 hello.so 文件),程序包运行良好。

有什么方法可以使这个过程自动化,这样我就不需要手动删除已编译的 c 文件了吗?

我看了这个stackoverflow question .但是,当我尝试使用 pip wheel . 构建轮子时,我在 cythonize 操作期间遇到错误。另外,就我而言,只要安装的代码不包含 hello.c

的纯文本文件,我就可以使用 tar.gz 安装

[编辑]

通过在我的 setup.py 中使用 include_package_data=False,我能够停止将 .c 文件放置在安装目录中。但是,我不确定这个选项是否适用于项目中的非 python 文件

请您参考如下方法:

您打算如何分发包?

没有 .c源可分发文件中的文件,Cython 成为您项目的依赖项。由于 Cython 是一个静态代码生成器,因此在 .c 之后 不需要它。生成文件。

通过将它们包含在您的源代码分发中,可以通过在 .c 上使用标准安装工具扩展来安装软件包而无需 Cython。文件而不是在 .pyx 上使用 cythonize文件。

这也是Cython documentation中的推荐其中展示了如何在开发和分发的两者之间切换。

如果你真的想排除它们并使 Cython 成为依赖项,请将以下内容添加到 MANIFEST.in

exclude mypackage/*.c