Dan*_*erg 5 distutils gfortran f2py
我继承了一个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
Run Code Online (Sandbox Code Playgroud)
这最终创建三个文件:my_module.o,my_wrapper.o,my_module.mod,和my_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, ]
)
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我的编译器会抛出许多警告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]
)
Run Code Online (Sandbox Code Playgroud)
如果您只使用my_modulefor 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]
)
Run Code Online (Sandbox Code Playgroud)
请注意,这也会将所有内容导出my_module到Python中,这可能是您不想要的.
我正在处理Python之外的这种双层库结构,使用cmake顶层构建系统.我有它设置,以便make python调用distutils来构建Python包装器.该setup.pyS能够安全地假定所有外部库已建成并安装.这种策略是有利如果想有一个安装系统范围的,再裹上针对不同的应用,如通用库Python,Matlab,Octave,IDL,...,它们都具有不同的方法来建立扩展.
| 归档时间: |
|
| 查看次数: |
1497 次 |
| 最近记录: |