C或Cython扩展

Astropy支持使用C扩展来包装C库,并支持使用Cython来加速计算密集型计算。Cython和C扩展构建都可以使用 get_extensions 功能 setup_package.py 文件。如果已定义,此函数必须返回 setuptools.Extension 物体。但是,子包的创建与子包的创建相关,而子包的创建则与此相关。

而C扩展必须始终通过 get_extensions 机械装置,Cython文件(结束于 .pyx )由自动定位 extension-helpers 如果它们不在 get_extensions . 对于以这种方式定位的Cython扩展,numpy C函数的头包含在构建中,但不包括其他外部头。 .pyx 由返回的扩展名中存在的文件 get_extensions 不包含在自动生成的扩展名列表中。

注解

如果A setuptools.Extension 使用Cython为对象提供源文件 get_extensions 机制,非常重要的是 .pyx 文件作为 source ,而不是 .c 由Cython生成的文件。

使用Numpy C头文件

如果您的C或Cython扩展使用 numpy 在C级别,您可能需要访问numpyc头文件。进行此操作时,应使用 numpy.get_include() 指定要使用的include目录,例如:

from setuptools import Extension
import numpy

def get_extensions():
    return Extension(name='myextension', sources=['myext.c'],
                     include_dirs=[numpy.get_include()])

安装C头文件

如果您的C扩展需要从其他第三方C代码链接,您可能希望在Python模块旁边安装它的头文件。

  1. 创建一个 include 所有头文件的目录。

  2. 使用 [options.package_data] 在你的章节 setup.cfg 在包中包含这些头文件的文件。例如 astropy.wcs 包中包含以下条目 [options.package_data] 章节:

    [options.package_data]
    ...
    astropy.wcs = include/*/*.h
    ...
    

阻止在生成时导入

重要的是要确保 setup_package.py 文件不会触发它们所在的包的导入,因此它们应该能够在不依赖于对包的其他部分的导入的情况下执行。

用ccache加速你的构建

ccache 是一个缓存已编译源的工具,这样即使输出已删除,也不必重新编译(只要它们保持不变)。这意味着,如果您切换分支或清理源代码签出,则可以通过避免大部分从头开始重新编译来节省大量时间。

由于ccache的安装和配置因平台而异,请参考ccache文档和/或Google在您的系统上设置ccache——这是强烈鼓励任何人在Astropy或科学编程方面进行重大开发的人。