python-3.x - python3 中 f2py 的 Makefile

为了在 python2 中使用 f2py 构建扩展模块,我一直在使用类似于以下内容的 Makefile:

default: fortran_lib.so

%.so::  %.f90
    f2py -c -m $* $<

为了完整性,这里还有一个虚拟的 fortran_lib.f90 文件

subroutine square(d)
implicit none
!f2py intent(inout) d
integer, intent(inout)  ::  d

d = d*d
end subroutine square

这过去工作得很好,make 只会生成 fortran_lib.so

现在我也想支持 python3,但是当使用 f2py3 时,make 会生成版本化的 fortran_lib.cpython-35m-x86_64-linux-gnu .so 而不是(在我的特定设置上)。

由于这与指定的目标名称不同,make 无法识别目标已经创建。因此,它会在您每次运行 make 时重新制作目标。

如何解决这个问题(无需对版本进行硬编码)?

  • 我可以告诉 f2py3 关闭版本控制吗?
  • 我能以某种方式解决 Makefile 中的版本控制问题吗?
  • 或者我是否被迫切换到其他工具来构建扩展模块(distutils,...)?

最佳答案

我的建议是保留版本控制(它的发明是有原因的……),而是找出它使用的后缀是什么。命令 python3-config --extension-suffix 得到它。

因此 makefile 看起来像

EXT_SUFFIX := $(shell python3-config --extension-suffix)

default: fortran_lib$(EXT_SUFFIX)

%$(EXT_SUFFIX): %.f90
    f2py3 -c -m $* $<

(我不确定 shell 是否是 GNU 扩展,如果是,它是否会降低可移植性。这可能需要考虑。)


如果您真的很想去掉后缀,那么您应该在规则中添加第二步,例如:

%.so::  %.f90
    f2py3 -c -m $* $<
    mv $*$(EXT_SUFFIX) $@

如果您不想使用 shell 来获取 EXT_SUFFIX,那么您可能想出一个有效的通配符。

我认为第二种选择比第一种更糟糕......

https://stackoverflow.com/questions/43618725/

相关文章:

r - 在 shinyapps.io 中部署 R 应用程序 - "Error:parsing man

arrays - Swagger 的对象数组

angular - HTML5 Websql - 如何与 Ionic 3 和 Angular 4 一

vim - 将行合并到 vim 中的段落

perl - 在 Perl 中打印哈希值

php - 从当前日期时间生成唯一的交易 ID

sql - 在 SQL Server 中将所有表数据类型从文本更改为 varchar

php - Laravel Eloquent : route model binding not w

c# - Unity Particle Collider 与粒子

python - 一种不必每次都在 colorama 中重置颜色/样式的方法