【问题标题】:Cython: control cythonize to stop placing compiled `.c` file from `.pyx` file in install directoryCython:控制 cythonize 停止将编译的 .c 文件从 `.pyx` 文件放入安装目录
【发布时间】:2017-07-25 22:00:55
【问题描述】:

我有一个包含敏感代码的小辅助函数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 构建/安装它时,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 文件

【问题讨论】:

  • 你的项目目录中有MANIFEST.in吗?如果是,它包含什么?
  • 没有MANIFEST.in..顺便说一句刚刚更新了问题

标签: python python-2.7 cython cythonize


【解决方案1】:

您打算如何分发该软件包?

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

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

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

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

exclude mypackage/*.c

【讨论】:

  • 我同意 Cython 是一个依赖项。谢谢这个作品
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多