尽管编译成功,f2py 仍未正确导入

f2py does not properly import, despite successfully compiling

我正在使用 f2py 成功编译我的 Fortran 子例程。但是,会创建一个文件夹以及一个 pyd 文件。

如果我没有将创建的 pyd 文件放在生成的文件夹中,我会收到此错误

ImportError: DLL load failed: The specified module could not be found.

如果我将生成的 .pyd 文件放在生成的文件夹中,我的 python 脚本将 运行,并且导入似乎有效。但是,如果我 运行 print(energy_f2py.__doc__) None 是输出,当我尝试使用子例程时出现错误 AttributeError: module 'energy_f2py' has no attribute 'potential_3'

potential_3energy_f2py.f90

里面的subroutine的名字

我也试过 energy_f2py.f90 一个包含子例程的模块,结果没有什么不同。

这是生成的pyd文件energy_f2py.cp36-win_amd64.pyd。我在 Pycharm(windows 10 64 位)中使用命令行来使用

编译 Fortran 文件
  1. f2py -c -m energy_f2py energy_f2py.f90

  2. python -m numpy.f2py -c -m energy_f2py energy_f2py.f90

同样的事情发生了。

pyd文件和文件夹都创建了,我觉得很奇怪,见下图

我卡在这了...好像已经完成了 95% 的工作...

最后,this other post 提出了一个解决方案,要求将 Python 和 Fortran 模块命名为不同的名称。这个我试过了,也没啥影响。

我找到的最佳解决方案是对我的硬盘进行分区并安装 Linux。我选择使用 Lubuntu,但你可以使用任何东西。

一切正常 Linux。

另一个选择是使用 -static 标志使其成为静态构建。这会将所需的一切构建到一​​个文件中:

python -m numpy.f2py -c -m energy_f2py energy_f2py.f90 -static

然后您应该能够使用该 .pyd 文件,无论您将它放在哪个文件夹中。

如果您正在使用 windows,我认为添加 --compiler=mingw32 可能会有所帮助。默认编译器是 windows.

上的 msvc

我发现生成的 .pyd 模块正在其所在的同一目录中查找 DLL 库。因此,尝试将 DLL 从 .libs 目录移动到 energy_f2py - 它在 Windows 10.

对我有用