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模块旁边安装它的头文件。
创建一个
include
所有头文件的目录。使用
[options.package_data]
在你的章节setup.cfg
在包中包含这些头文件的文件。例如astropy.wcs
包中包含以下条目[options.package_data]
章节:[options.package_data] ... astropy.wcs = include/*/*.h ...
阻止在生成时导入¶
重要的是要确保 setup_package.py
文件不会触发它们所在的包的导入,因此它们应该能够在不依赖于对包的其他部分的导入的情况下执行。