相关疑难解决方法(0)

ctypes卸载DLL

我正在加载一个像这样的ctypes的DLL:

lib = cdll.LoadLibrary("someDll.dll");
Run Code Online (Sandbox Code Playgroud)

当我完成库,我需要卸载它以释放它使用的资源.我在文档中找到有关如何执行此操作的任何内容时遇到问题.我看到这个相当古老的帖子:如何在Python中使用ctypes卸载DLL?.我希望有一些显而易见的东西,我没有找到,而不是一个黑客.

python ctypes

16
推荐指数
1
解决办法
7419
查看次数

我可以明确关闭ctypes CDLL吗?

我有一个Python 2.7 GUI用于与C库交互.我在GUI中做了一堆设置,然后按"go"按钮.然后,我正在查看结果,不再需要库代码.但我想在更改库时保持所有GUI状态.

我导入sodll使用ctypes,显然打开文件进行阅读.但是,我想显式关闭该文件,以便重新编译并覆盖它.然后,当我再次按下"go"按钮时,我想导入新版本.

在最糟糕的情况下,我可以将文件复制到一个tempfile.NamedTemporaryFile,但后来我有几十个文件的句柄,没有一个我可以清理.

我可以以某种方式显式关闭文件句柄吗?或者,我可以将文件的内容读入StringIO对象并以某种方式指向该对象ctypes吗?

python ctypes

11
推荐指数
1
解决办法
4499
查看次数

强制 ctypes.cdll.LoadLibrary() 从文件重新加载库

我有以下代码

import ctypes
lib1 = ctypes.cdll.LoadLibrary("./mylib.so")
# modify mylib.so (code generation and compilation) or even delete it
lib2 = ctypes.cdll.LoadLibrary("./mylib.so")
Run Code Online (Sandbox Code Playgroud)

问题是lib2指的是原始共享库,而不是新共享库。如果我在调用之间删除 mylib.so ,则不会出现错误。

使用ctypes._reset_cache()没有帮助。

我如何判断ctypes是否真正从硬盘重新加载库?

python dll ctypes

7
推荐指数
1
解决办法
3124
查看次数

使用ctypes windll卸载64位dll时出错

我发现这里有几篇关于使用ctypes卸载dll的帖子,我完全按照ctypes import*的方式进行操作

file = CDLL('file.dll')

# do some stuff here

handle = file._handle # obtain the DLL handle

windll.kernel32.FreeLibrary(handle)
Run Code Online (Sandbox Code Playgroud)

但是,我在python 64位,我的DLL也编译为x64,我从上面的最后一行得到一个错误说:

argument 1: <class 'OverflowError'>: int too long to convert
Run Code Online (Sandbox Code Playgroud)

我检查句柄是'8791681138688'的长int(int64),那么这是否意味着windll.kernel32只处理int32句柄?谷歌搜索显示kernal32也适用于64位窗口.我应该怎么处理呢?

python 64-bit ctypes

4
推荐指数
1
解决办法
2166
查看次数

标签 统计

ctypes ×4

python ×4

64-bit ×1

dll ×1