Cython:控制cythonize以停止从安装目录

时间:2017-07-25 22:00:55

标签: python python-2.7 cython cythonize

我有一个包含敏感代码的小辅助函数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.pypip install构建/安装它时,生成的hello.c以及hello.so的cython将被放置在安装目录中(在我的案例~/.local/python2.7/site-packages/mypackage/

我可以从安装目录中手动删除hello.c(只留下hello.so文件)并且包运行正常。

有没有办法可以自动执行此过程,这样我就不需要手动删除已编译的c文件了?

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

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

[编辑]

我能够在我的.c中使用include_package_data=False停止在安装目录中放置setup.py文件。但是,我不确定此选项是否意味着非python文件在项目中

1 个答案:

答案 0 :(得分:4)

您打算如何分发包裹?

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

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

这也是Cython documentation中的建议,其中显示了如何在两者之间切换以进行开发和分发。

如果您确实要排除它们并使Cython成为依赖项,请将以下内容添加到MANIFEST.in

exclude mypackage/*.c