我继承一个Fortran 77码,它实现其通过程序块,其需要用户输入的显著量经由交互式命令提示每次程序运行时运行的若干子例程。因为我想自动运行的代码,我把所有的子程序成一个模块并通过F2PY写了一个包装代码。一切两步编译后正常工作:
gfortran -c my_module.f90 -o my_module.o -ffixed-form
f2py -c my_module.o -m my_wrapper my_wrapper.f90
这最终创建三个文件:my_module.o
,my_wrapper.o
,my_module.mod
和my_wrapper.so
。该my_wrapper.so
是我导入到Python来访问遗留Fortran代码模块。
我的目标是包括这个代码封装较大的科学代码,已经有使用setup.py
建设用Cython模块distutils
使用。完全忽视了当下用Cython代码,我怎么翻译2步建设成为在setup.py
的延伸?我已经能够找出关闭的样子:
from numpy.distutils.core import setup, Extension
wrapper = Extension('my_wrapper', ['my_wrapper.f90', ])
setup(
libraries = [('my_module', dict(sources=['my_module.f90']],
extra_f90_compile_args=["-ffixed-form", ])))],
ext_modules = [wrapper, ]
)
这是不行的,虽然。我的编译器会引发对my_module.f90
很多的警告,但它仍然编译(如果我使用上面的编译器调用它抛出没有警告)。当它试图编译虽然包装,它未能找到my_module.mod
,即使成功创建它。
有什么想法吗?我有一种感觉,我失去了一些东西微不足道,但只是似乎并不充实了足够的文件,以表明它可能是什么。
这可能是有点晚了,但你的问题是,建设my_module
当你不my_wrapper
链接:
wrapper = Extension('my_wrapper', sources=['my_wrapper.f90'], libraries=['my_module'])
setup(
libraries = [('my_module', dict(sources=['my_module.f90'],
extra_f90_compile_args=["-ffixed-form"]))],
ext_modules = [wrapper]
)
如果您my_module
的唯一用途是用于my_wrapper
,你可以简单地把它添加到my_wrapper
来源:
wrapper = Extension('my_wrapper', sources=['my_wrapper.f90', 'my_module.f90'],
extra_f90_compile_args=["-ffixed-form"])
setup(
ext_modules = [wrapper]
)
请注意,这也将在my_module
导出一切到Python,你可能不希望。
我处理这样的两层库结构的Python以外,使用cmake
作为顶层构建系统。我有它设置,使make python
调用的distutils构建Python包装。该setup.py
s可以安全地假设所有外部库已建成并安装。这种策略是有利如果想有一个安装系统范围的,再裹上针对不同的应用,如Python
,Matlab
,Octave
,IDL
,......,它们都具有不同的方法来创建扩展的通用库。