翻译F2PY编译步入setup.py(Translate F2PY compile steps in

2019-08-16 21:46发布

我继承一个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.omy_wrapper.omy_module.modmy_wrapper.so 。 该my_wrapper.so是我导入到Python来访问遗留Fortran代码模块。

我的目标是包括这个代码封装较大的科学代码,它已经具备了使用setup.py使用distutils构建一个用Cython模块。 完全忽视了当下用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 ,即使成功创建它。

有什么想法吗? 我有一种感觉,我失去了一些东西微不足道,但只是似乎并不充实了足够的文件,以表明它可能是什么。

Answer 1:

这可能是有点晚了,但你的问题是,你是不是在联系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_modulemy_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能够安全地假定所有外部库已建成并安装。 这种策略是有利如果想有一个安装系统范围的,再裹上针对不同的应用,如通用库PythonMatlabOctaveIDL ,......,它们都具有不同的方法来建立扩展。



文章来源: Translate F2PY compile steps into setup.py