使用setuptools和numpy.distutils打包传统的Fortran代码到Python中,这样做是否可行?

53

我正在尝试为领域中一些热门的Fortran代码制作一个Python包分发。 我希望它使用最标准的方法,即 setup.py 文件。 该相关问题对学习如何包装Fortran扩展非常有帮助。

在使用此方法时,当混合使用setuptoolsnumpy.distutils时,我注意到了一些令人困惑的行为。 混合使用两者是否是不良实践?截至2015年,似乎尽可能使用setuptools更可取。

但是,我想以与numpy兼容的方式构建Fortran扩展。 因此,我想从numpy.distutils导入以获取Extensionsetup

我使用以下基本方法:

from setuptools.command.develop import develop
from numpy.distutils.core import Extension, setup

ext_modules=[Extension("my_package.fortran_mod", sources=['src/fortran_mod.f'])]

class MyDevelop(develop):
  def run(self):
    my_script()
    develop.run(self)

setup(
  ...
  ext_modules=ext_modules,
  cmdclass={'develop':MyDevelop})

这似乎能够工作,但我有一些问题。

  1. 通常混合使用 setuptoolsnumpy.distribute 是一个好的实践吗?
  2. 我导入它们的顺序是否很重要?我应该总是先导入 setuptools 吗?
  3. 是否有官方的最新教程来打包扩展到 numpy?也许其中还包括一些关于 Fortran 扩展的讨论?

一些链接

https://www.youtube.com/watch?v=R4yB-8tB0J0

http://www.fortran90.org/src/best-practices.html#interfacing-with-python


5
我不是Fortran代码封装方面的专家,但我对Cython相当有经验。这个来自Scipy 2015的演讲有一个非常好的部分,可以成功地封装Fortran代码 - 我建议你去看一下! - BeRecursive
2
标准Python是什么意思?如果你想将任务委托给本地代码并利用线程/多进程,那么nogil非常重要。你的MPI示例是释放GIL的完美时机! - BeRecursive
2
与f2py相比,Cython允许您在Fortran代码中使用iso_c_binding。因为f2py主要是为Fortran77代码构建的,所以它缺少许多伟大的Fortran90+功能,例如动态内存分配。使用Cython,您具有更大的灵活性,因为您的Fortran和Cython代码可以使用iso_c_binding(几乎本地)彼此交流。 - Max Graser
2
根据之前的一些评论,我想为您的考虑贡献两个更多的选项。如果您使用“旧”的Fortran,那么您可以直接使用ctypes访问您的Fortran函数(只需注意函数名称,这取决于您的编译器,会得到一个尾随下划线)。最近我成为了pybind11的粉丝,它允许您从C++编写整个Python模块,并带有额外的优势,即古老的Fortran代码获得了现代化的前端。 - Tom de Geus
2
@Will 在你进行Fortran转换之前,你确定它们还没有在SciPy低级Fortran接口中实现吗?https://github.com/scipy/scipy/blob/master/scipy/linalg/blas.py 以及 lapack.py ,你很难写出更快的东西(我已经用MKL尝试过,只能将时间缩短几微秒(即没有统计学意义的改进))此外,看一下那里,他们有一些预先编写的Cython测试程序(dgemm确实存在一个错误,您可以通过搜索我的帖子“ SciPy dgemm接口无法在mx1 1xn向量上工作”来解决) - Matt
显示剩余5条评论
1个回答

3

这似乎可以工作,但我有问题。

  1. 混合使用setuptools和numpy.distribute通常是好的做法吗?
  2. 我导入它们的顺序是否重要?我应该总是先导入setuptools吗?
  3. 是否有官方的最新教程来打包numpy扩展?也许甚至有一些关于Fortran扩展的讨论?
  1. 您不再需要使用numpy.distribute。

  2. ^^ 不必要

  3. 特别是对于使用numpy包装fortran代码,有一个受欢迎的f2py。然而,我个人认为必要的代码注释多余了,因为好的fortran代码包含了所有必要的信息。

(下面是个人项目插件警告)

最近发布了更干净的fmodpy,它以可理解和清晰的界面自动生成所有必要的包装器代码。它支持预Fortran90,但最适合Fortran90及以上版本。它可以用于生成与python接口的整洁分发(假定用户已安装gfortran)。


1
个人项目插头没有问题,但这个回答有问题。您能否在上面的1、2、3中引用您正在回答的问题,以便这个答案可以实际上被阅读? - Stephen Rauch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接