python-3.x f2py无法正确导入,尽管成功编译

llew8vvj  于 2023-10-21  发布在  Python
关注(0)|答案(5)|浏览(172)

我成功地用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_3energy_f2py.f90subroutine的名称
我还尝试将energy_f2py.f90作为包含子例程的模块,结果没有任何不同。
这是由energy_f2py.cp36-win_amd64.pyd生成的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模块命名不同的名称。我试过了,也没什么区别。

xpcnnkqh

xpcnnkqh1#

我找到的最好的解决方案是对我的硬盘分区并安装Linux。我选择使用Lubuntu,但你可以使用任何东西。
在Linux上一切都正常工作。

ca1c2owp

ca1c2owp2#

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

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

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

soat7uwm

soat7uwm3#

如果你使用的是windows,我想添加--compiler=mingw32可能会有帮助。默认编译器是windows上的msvc。

6mzjoqzu

6mzjoqzu4#

我突然想到,生成的.pyd模块正在它本身所在的同一目录中查找DLL库。因此,尝试将DLL从.libs目录移动到energy_f2py-它在Windows 10上对我有效。

8wigbo56

8wigbo565#

我遇到了同样的问题,并找到了解决方案。Python在解析导入的扩展模块的依赖关系时会搜索一些路径。我们可以将文件夹“.libs”添加到它通过

# __init__.py
import os
os.add_dll_directory("/path/to/.libs")

所以你不需要将“.libs”中的DLL移动到其他地方。注意在将其添加到dll目录之前检查“.libs”是否存在。

相关问题