我目前在包装一些Fortran子程序以便在python3脚本中使用时遇到问题。自从我尝试在子例程中使用OpenMP以来,这个问题才出现。
例如,如果我编译模块' test.pyd'使用f2py -c -m --fcompiler=gfortran --compiler=mingw32 --f90flags='-fopenmp' test test.f90 -lgomp
,其中' test.f90'是一个包含并行循环的Fortran子例程,在尝试将此模块导入我的脚本时,遇到ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.
。
在编译中删除-fopenmp
标志,或Fortran子例程中的!$omp
注释删除此错误。
将子程序更改为大致相当的Fortran程序,程序将编译为.exe并并行运行。
我在Windows 10平台上使用AMD64处理器,使用来自TDM-GCC的GNU Fortran和C编译器
答案 0 :(得分:0)
我刚试过你的构建命令,它看起来完全没问题。我自己能够从你正在编写的python模块中运行并行子程序。
你是如何执行使用你的模块的python代码的?我认为问题是你的路径中没有openmp dll(名为libgomp-1.dll
)
我建议你运行(从bash shell):
where libgomp-1.dll
如果命令找不到它,那么你应该将你的openmp dll的路径(通常是“C:\ tools \ mingw64 \ bin \”)添加到你的路径中。
为此,您可以使用:
export PATH=$PATH:C:\tools\mingw64\bin\ && python script_using_module.py
您执行python代码的方式很可能无法正确计算路径,因为您可以毫无问题地运行并行可执行文件。