带有Openmp的F2py在Python中导致导入错误

时间:2017-09-30 18:24:30

标签: python fortran openmp f2py

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

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

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

  

ImportError:DLL加载失败:动态链接库(DLL)初始化例程失败。

我已经使用依赖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的反馈,我已将示例代码替换为子程序而非程序,尽管这对我的问题没有任何影响。

2 个答案:

答案 0 :(得分:0)

这对我有用:

<强> 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

答案 1 :(得分:0)

似乎问题在于使用tdm-gcc-64作为编译器,所以我改为使用mingw64安装,它按预期工作。