2017-07-06 94 views
0

我在包装一些Fortran子程序以用于python3脚本时遇到了一个问题。自从我试图在子例程中使用OpenMP后,此问题才出现。用OpenMP编译的f2py模块的Python导入错误

例如,如果我使用f2py -c -m --fcompiler=gfortran --compiler=mingw32 --f90flags='-fopenmp' test test.f90 -lgomp编译模块'test.pyd',其中'test.f90'是包含并行循环的Fortran子例程,试图将此模块导入到我的脚本中时,遇到ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.

删除编译中的-fopenmp标志或Fortran子例程中的!$omp注释删除此错误。

将子例程更改为大致等效的Fortran程序,该程序编译为.exe并且并行运行正确。

我是Windows 10平台上,与AMD64处理器,采用GNU Fortran和C编译器从TDM-GCC

回答

0

我只是想你的构建命令,它看起来prefectly罚款。我自己能够从一个Python模块运行一个并行子程序,这个子程序是按照你所做的方式编译的。

你是如何执行使用你的模块的Python代码?我认为问题是,你没有OpenMP的DLL(名为libgomp-1.dll)在您的路径

我劝你(从bash shell中)运行:

where libgomp-1.dll

如果该命令找不到它,那么你应该添加路径到你的PATH的openmp dll(通常是“C:\ tools \ mingw64 \ bin \”)。

为了做到这一点,你可以使用:

export PATH=$PATH:C:\tools\mingw64\bin\ && python script_using_module.py 

有一个很好的机会,你正在执行Python代码不会为路径正确计算的方式,因为你可以运行并行执行没有问题。

+0

谢谢您的回复!我在我的PATH中包含了'C:\ TDM-GCC-64 \ bin',其中包括C和Fortran编译器以及'libgomp-1.dll'。 最初我从iPython控制台(使用Anaconda3)运行脚本,但是为了简化问题,我只是尝试打开一个Python3控制台,并输入'import test',达到相同的效果(将.pyd文件添加到当然是正确的目录) –

+0

如果你在你的脚本所在的目录中打开一个常规的'cmd'控制台,然后运行'python your_script.py'?它会产生相同的错误吗? (不是用anaconda python控制台)。水蟒可能会混淆你的PATH。 – Thundzz

+0

不幸的是,我在Python 3.6.0中遇到了同样的错误。我已经从系统PATH中删除了Anaconda3,并且在编译时没有OpenMP标志,模块成功导入,并且当我重新引入该标志时,出现原始错误。 我刚才已经进入一个'cmd'控制台,将两个.pyd文件输入我Python36文件夹后: '进口numpy' '进口omp_test_mod' 最后一行后,将出现错误 '进口test_mod'像之前一样。键入'libgomp-1.dll'表明它确实在PATH中。 –