【问题标题】:Packaging legacy Fortran in Python. Is it OK to use setuptools and numpy.distutils?在 Python 中打包旧版 Fortran。可以使用 setuptools 和 numpy.distutils 吗?
【发布时间】:2015-10-02 00:17:39
【问题描述】:

我正在尝试为我所在领域的一些流行的 Fortran 代码制作 python 包分发。我希望它对setup.py 文件使用最标准的方法。相关问题对学习很有帮助how to wrap Fortran extensions

在使用这种方法时,我注意到在混合 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

【问题讨论】:

  • 我不是包装 Fortran 代码的专家 - 但我对 Cython 非常有经验。来自 Scipy 2015 的 This talk 有一个关于成功包装 Fortran 代码的非常好的部分 - 我建议你看看!
  • 标准 Python 是什么意思? nogil 非常重要,如果您希望能够委托给本机代码并使用线程/多进程。您的 MPI 示例是发布 GIL 的最佳时机!
  • 相比 f2py,Cython 允许你在 Fortran 代码中使用iso_c_binding。因为 f2py 主要是为 Fortran77 代码构建的,它缺乏很多 Fortran90+ 的强大功能,例如动态内存分配。使用 Cython,您拥有更大的灵活性,因为您的 Fortran 和 Cython 代码可以使用 iso_c_binding (几乎是本机)相互交流。
  • 继一些早期的 cmets 之后,我想再提供两个选项供您参考。如果您使用“旧”Fortran,那么您可以使用 ctypes 直接访问您的 Fortran 函数(只需注意函数名称,根据您的编译器,它会得到一个尾随下划线)。最近我成为了pybind11 的粉丝,它允许您使用 C++ 编写整个 Python 模块,并且具有古老的 Fortran 代码获得现代前端的额外优势。
  • @Will 在进行 Fortran 转换之前,您确定它们还没有在 SciPy 低级 Fortran 接口中实现吗? github.com/scipy/scipy/blob/master/scipy/linalg/blas.py 还有 lapack.py 你很难写出更快的东西(我已经尝试过 MKL 并且只能剃掉可能只有几微秒的时间(即没有统计学上显着的改进))也看看那里他们有一些 prewitten Cython 测试程序(dgemm 确实有一个错误,您可以通过搜索我的 SciPy dgemm interface not working on mx1 1xn vectors 的帖子来解决)

标签: python numpy fortran setuptools f2py


【解决方案1】:

这似乎可行,但我有疑问。

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

  2. ^^ 不需要

  3. 特别是用 numpy 包装 fortran 代码,有流行的f2py。但是我个人认为必要的代码注释是多余的,因为好的 fortran 代码包含所有必要的信息。

(警告个人项目插件如下)

最近发布的是清洁器fmodpy,它会在一个易于理解和干净的界面中自动生成所有必要的包装器代码。它支持 pre-Fortran90,但最适合 Fortran90 及更高版本。它可以用来生成一个干净的分布以及代码的python接口(假设用户已经安装了gfortran)。

【讨论】:

  • 个人项目插件没问题,但是这个答案是。您能否参考您在上述 1、2、3 中回答的问题,以便可以按原样实际阅读此答案
猜你喜欢
  • 2015-04-06
  • 1970-01-01
  • 2012-06-29
  • 2012-06-24
  • 2018-08-03
  • 2017-07-12
  • 2011-11-25
  • 1970-01-01
  • 2015-04-02
相关资源
最近更新 更多