我成功地用f2py编译了我的Fortran子例程。但是,会创建一个文件夹和一个pyd文件。
如果我没有把创建的pyd文件放在生成的文件夹中,我会得到这个错误ImportError: DLL load failed: The specified module could not be found.
如果我将生成的.pyd文件放在generated文件夹中,我的python脚本将运行,并且导入似乎可以工作。但是,如果我运行print(energy_f2py.__doc__)
,输出是None
,当我尝试使用子例程时,我得到错误AttributeError: module 'energy_f2py' has no attribute 'potential_3'
potential_3
是energy_f2py.f90
中subroutine
的名称
我还尝试将energy_f2py.f90
作为包含子例程的模块,结果没有任何不同。
这是由energy_f2py.cp36-win_amd64.pyd
生成的pyd文件。我使用Pycharm(windows 10 64位)中的命令行编译Fortran文件,
f2py -c -m energy_f2py energy_f2py.f90
python -m numpy.f2py -c -m energy_f2py energy_f2py.f90
同样的事情也会发生。
在我看来,创建pyd文件和文件夹似乎很奇怪,请参见下面的图像
我在这一点上卡住了...这似乎是95%的工作方式...
最后,this other post有一个解决方案,说要为Python和Fortran模块命名不同的名称。我试过了,也没什么区别。
5条答案
按热度按时间xpcnnkqh1#
我找到的最好的解决方案是对我的硬盘分区并安装Linux。我选择使用Lubuntu,但你可以使用任何东西。
在Linux上一切都正常工作。
ca1c2owp2#
另一个选项是使用
-static
标志使其成为静态构建。这会将所需的所有内容构建到一个文件中:然后,您应该能够使用该
.pyd
文件,无论您将其放置在哪个文件夹中。soat7uwm3#
如果你使用的是windows,我想添加
--compiler=mingw32
可能会有帮助。默认编译器是windows上的msvc。6mzjoqzu4#
我突然想到,生成的
.pyd
模块正在它本身所在的同一目录中查找DLL库。因此,尝试将DLL从.libs
目录移动到energy_f2py
-它在Windows 10上对我有效。8wigbo565#
我遇到了同样的问题,并找到了解决方案。Python在解析导入的扩展模块的依赖关系时会搜索一些路径。我们可以将文件夹“.libs”添加到它通过
所以你不需要将“.libs”中的DLL移动到其他地方。注意在将其添加到dll目录之前检查“.libs”是否存在。