gpt4 book ai didi

distutils - 将F2PY编译步骤翻译成setup.py

转载 作者:行者123 更新时间:2023-12-02 22:55:14 31 4
gpt4 key购买 nike

我继承了 Fortran 77 代码,该代码实现了多个子例程,这些子例程通过程序 block 运行,每次运行程序时都需要通过交互式命令提示符进行大量用户输入。由于我想自动运行代码,因此我将所有子例程移至一个模块中,并通过 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.somy_wrapper.so 是我导入到 Python 中以访问旧版 Fortran 代码的模块。

我的目标是将此代码包含在更大的科学代码包中使用,该代码包已经有一个使用 distutils 构建 Cython 模块的 setup.py 。暂时完全忽略 Cython 代码,我应该如何将两步构建转换为 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我们可以放心地假设所有外部库都已构建并安装。如果希望拥有在系统范围内安装的通用库,然后为不同的应用程序(例如Python)进行包装,那么这种策略是有利的。 , Matlab , Octave , IDL ,...,它们都有不同的方式来构建扩展。

关于distutils - 将F2PY编译步骤翻译成setup.py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14805236/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com