【问题标题】:Python Import error for f2py modules compiled with OpenMP使用 OpenMP 编译的 f2py 模块的 Python 导入错误
【发布时间】:2017-07-06 20:02:10
【问题描述】:

我目前在包装一些 Fortran 子例程以在 python3 脚本中使用时遇到问题。自从我尝试在子例程中使用 OpenMP 后才出现此问题。

例如,如果我使用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 cmets 删除此错误。

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

我在 Windows 10 平台上,配备 AMD64 处理器,使用来自 TDM-GCC 的 GNU Fortran 和 C 编译器

【问题讨论】:

  • 我遇到了完全相同的问题。看来 TDM-GCC 与 py3 不兼容。

标签: python openmp f2py


【解决方案1】:

我刚刚尝试了您的构建命令,它看起来非常好。我自己能够从按照您的方式编译的 python 模块运行并行子例程。

您如何执行正在使用您的模块的 python 代码?我认为问题在于您的路径中没有openmp dll(名为libgomp-1.dll

我建议你运行(从 bash shell):

where libgomp-1.dll

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

为此,您可以使用:

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

您执行 python 代码的方式很可能没有正确考虑路径,因为您可以毫无问题地运行并行可执行文件。

【讨论】:

  • 感谢您的回复!我在我的 PATH 中包含了 C:\TDM-GCC-64\bin,其中包括 C 和 Fortran 编译器,以及 libgomp-1.dll。最初我从 iPython 控制台运行脚本(使用 Anaconda3),但是为了简化问题,我只是尝试打开 Python3 控制台,然后输入 import test,以达到相同的效果(在将 .pyd 文件添加到正确的目录之后当然)
  • 如果您在脚本所在的目录中打开一个常规的cmd 控制台,然后运行python your_script.py 会怎样?它会产生相同的错误吗? (不使用 anaconda python 控制台)。 Anaconda 可能会弄乱你的 PATH。
  • 不幸的是,我在 Python 3.6.0 中遇到了同样的错误。我已经从系统 PATH 中删除了 Anaconda3,并且在没有 OpenMP 标志的情况下编译模块成功导入,并且当我重新引入标志时出现原始错误。我刚刚进入cmd 控制台,在将两个 .pyd 文件添加到我的 Python36 文件夹后,键入:import numpyimport test_modimport omp_test_mod 错误出现在最后一行之后。输入 where libgomp-1.dll 表明它确实在 PATH 中。
  • 我现在已经在 Ubuntu 工作站上对此进行了测试,它可以毫无问题地导入。这将是我现在的解决方法 - 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
相关资源
最近更新 更多