问题将 python 2.7 CLL 调用转换为 python 3.11 libgfortran_64-3.dll 问题

问题描述 投票:0回答:0

我正在尝试将为 python 2.7 编写的本地包转换为 python 3.x。 该包是一系列 Fortran DLL 的包装器。在 2.7 中运行时,该程序包在我的计算机上运行良好,但是在 3.11 中加载 DLL 时,我得到

OSError: [WinError 1114] 动态链接库 (DLL) 初始化例程失败

我的问题可以用以下代码(简化的 2.7 代码)复制

from ctypes.util import find_library
from ctypes import CDLL

library_path = find_library("libSEMFEM")
clib = CDLL(library_path,0x102)

我的 PATH 变量中 libSEMFEM.dll 的目录。

通过ctypes的实现,ctypes最终调用

self._handle = _dlopen(self._name, mode)

在 python 2.7 中,模式变为

0x102
,在 Python 3.11(如果 winmode=None)中,模式变为
0x1100
。根据 LoadLibraryExA 文档 0x1100 是
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
.

如果我在 python 2.7 中执行代码,它就可以清楚地结束 Windows 事件日志,如果我在 3.11 中执行相同的代码,它会给出

OSError: [WinError 1114] 动态链接库 (DLL) 初始化例程失败

在事件日志中我得到:

Faulting application name: python.exe, version: 3.11.2150.1013, time stamp: 0x63e27f1e
Faulting module name: libgfortran_64-3.dll, version: 0.0.0.0, time stamp: 0x52472432
Exception code: 0xc0000005
Fault offset: 0x0000000000017e9b
Faulting process id: 0x3804
Faulting application start time: 0x01d9609c52389bf3
Faulting application path: C:\Program Files\Python311\python.exe
Faulting module path: C:\SEMFEM\lib64\libgfortran_64-3.dll
Report Id: cf0bf001-762a-4112-81f5-568e0eb0859f
Faulting package full name: 
Faulting package-relative application ID: 

我按照 3.11 中的 ctype 实现,看到

mode
被忽略并基于
winmode
构建了一个新值。设置
winmode=0x102
DLL加载但是我无法访问任何功能并获得
AttributeError: function 'FUNCTION_NAME' not found
.

我原以为从较新版本的 python 调用同一台计算机上的相同 DLL 的工作方式基本相同。

我看到事件日志错误指向 libgfortran_64-3.dll。我尝试加载它并在事件日志中得到完全相同的错误。

我在 libSEMFEM.dll 上运行了 dependency walker,libgfortran_64-3.dll 确实出现了。所以我不知道我错过了什么。

编辑: 基于@CristiFati 的评论,如果我从 python 2.7 成功调用 DLL,我添加了更多细节它看起来像这样

我能让 python 3.11 不在 CDLL 上失败的唯一方法是传入

winmode=0x1
,它不加载依赖项,另一个 dll 不加载,但至少基础是相同的。

我只能认为它与正在使用的搜索路径有关,但在我看来

mode = 0x1100
应该“只是”工作

python dll ctype
© www.soinside.com 2019 - 2024. All rights reserved.