在python中使用ctypes(或其他)卸载dll

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

我正在努力卸载之前在 python 循环中加载的 fortran 编译的 dll。

这是问题: 我需要进行大量模拟,改变一些参数。所有运行都使用相同的外部 dll。

这是我的方法示例,从现在开始

    import ctypes as ct

    param = # list of pameter value I'd like to study
    results = []

    for val in param:
        # the dll is loaded
        dll = ct.CDLL(my_dll_path)
        #function that plays with the dll
        results.append(dll.compute_What_I_Want(val))
    
        #I want to unload the dll to open a new instance in the next loop
        handle = dll._handle
        del dll
        ct.windll.kernel32.FreeLibrary.argtypes = [wintypes.HMODULE]
        ct.windll.kernel32.FreeLibrary(handle)

问题是第二个循环失败,因为我的 dll 说第一个实例未关闭(变量错误已在第一个实例中分配)。

我已经做了很多尝试,查看了与此主题相关的很多线程,但没有得到任何解决方案......

这篇文章对我来说就像是大海里的瓶子。

提前感谢您的帮助 (环境:Windows、Python 3.9)

python ctypes
1个回答
0
投票

感谢评论,以下是上述问题的一些补充内容:

一个重要信息:该 dll 是我的。我自己在VS中用IFX编译器编译dll。

该dll可以在多处理模式下成功使用,但始终仅用于第一轮运行:1个核心(1个线程)-> 1dll,但是一旦模拟完成,我仍然无法在该线程中打开该dll的新实例因为 dll 说内部变量已经分配:Fortran 严重错误。

我尝试在 fortran 中使用“STOP”命令在新的 dll 函数中实现。但这也杀死了 python 进程。所以我想 dll 需要在 python 内部关闭,而不是由 fortran 本身关闭。

我目前正在使用IFX编译器在VS中编译dll,是否应该向编译器添加一些选项,以便能够使用ctypes FreeLibrary函数很好地关闭dll?

或者有没有办法通过正在使用的核心内的 PID 或 ID 来杀死 fortran 内的 dll?

NB:一种解决方法可能是在调用第一个 dll 函数(这是一个经典的 initi_solver 函数)时取消分配 fortran 代码内的所有变量,但缺点是它需要大量工作并影响全局 fortran 的体系结构代码→现阶段不是一个好的选择。当 dll 一开始就不存在时,一切都会正常工作。

感谢您的帮助

© www.soinside.com 2019 - 2024. All rights reserved.