使用c_iso_binding和Cython封装Fortran的Python包单setup.py编译方案问询
可以通过单个setup.py实现该编译工作流,且有更简洁、无编译器不一致风险的实现方案
核心实现思路
- 完全采用
numpy.distutils作为构建入口,不需要引入Cython自带的distutils扩展,也不需要手动显式调用Fortran编译器。numpy.distutils原生支持同时处理Fortran源码编译、Cython代码转译与扩展编译,整个构建流程的编译器配置由工具统一管理,不会出现编译器不匹配的问题。
最简示例代码
from numpy.distutils.core import setup, Extension from Cython.Build import cythonize import numpy as np # 定义扩展模块 fortran_cython_ext = Extension( name="mypackage.myext", sources=[ "my_interface.pyx", # 自行编写的Cython接口文件 "fortran_wrapper.f90", # 带c_iso_bindings的Fortran封装代码 "original_fortran_src.f90" # 原始Fortran业务代码 ], include_dirs=[np.get_include()] ) setup( name="mypackage", version="0.1.0", ext_modules=cythonize(fortran_cython_ext, language_level="3") )
工作流说明
- 构建时
cythonize会自动把.pyx文件转译为C语言扩展代码 numpy.distutils会自动识别源码列表里的Fortran文件,调用匹配的Fortran编译器完成编译,同时自动处理Fortran模块的依赖顺序- 所有编译产物会自动链接为完整的Python扩展模块,完全匹配Fortran封装→Cython调用的工作流要求
可选优化
- 可以把编译参数、包元信息都放到同目录的
setup.cfg中配置,setup.py只保留核心构建逻辑,代码会更简洁。
内容的提问来源于stack exchange,提问作者nedlrichards
相关产品推荐
相关产品推荐

