使用 Openmp 的 F2py 在 Python 中出现导入错误

F2py with Openmp gives import error in Python

我能够在使用 Openmp 的 Fortran 中编译下面的最小工作示例,运行 给出了预期的结果(打印 1)。

subroutine test
use omp_lib
write(*,*) omp_get_num_threads()
end subroutine 

但是在 python 中使用 f2py 会出现错误:

ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.

我已经使用 dependency walker 来测试问题是否出在链接到 openmp dll 上,但是以下 .dll 在 fortran 可执行文件和从 f2py 编译的 .pyd 中链接:

c:\tdm-gcc-64\bin\LIBGOMP_64-1.DLL

因此我很困惑为什么 python 无法加载 .dll,因为它似乎是从 f2py 正确链接的。我用来生成 .pyd 的 f2py 命令是

python -m numpy.f2py -c -m %output% %input%.f90 --fcompiler=gnu95 --compiler=mingw32 --f90flags="-fopenmp " -lgomp

非常感谢任何帮助,谢谢。

编辑:我已经用另一台具有相同安装设置的 windows PC 对此进行了测试,并收到相同的错误消息。我错过了什么吗?

编辑 2:显然这个程序在 f2py 中实际上不起作用,所以是不好的例子。我很抱歉。我实际上正在使用子例程,只要不存在 openmp 命令,它们就能够正确地使用 f2py。

编辑 3:由于 Pierre de Buyl 的反馈,我已将示例代码替换为子例程而不是程序,尽管这对我的问题没有影响。

这对我有用:

tesf.f95

subroutine nthreads
    !$ use omp_lib
    integer :: nt

    nt = 0
    !$ nt = omp_get_max_threads()

    write(*,*) 'Nthreads'
    write(*,*) nt

end subroutine

编译:

f2py -c test.f95 -m test --f90flags='-fopenmp' -lgomp -lpthread --compiler=mingw32 --fcompiler=gfortran

如果我运行:

python -c "import test; test.nthreads()"

结果是:

 Nthreads
           8

问题似乎出在使用 tdm-gcc-64 作为编译器时,因此我改为使用按预期工作的 mingw64 安装。