当前位置: 首页 > 面试题库 >

如何在Python中使用ctypes卸载DLL?

段成益
2023-03-14
问题内容

我正在使用ctypes在Python中加载DLL。这很好。

现在,我们希望能够在运行时重新加载该DLL。

直接的方法似乎是:1.卸载DLL 2.加载DLL

不幸的是,我不确定卸载DLL的正确方法是什么。

_ctypes.FreeLibrary可用,但私有。

还有其他卸载DLL的方法吗?


问题答案:

您应该能够通过放置对象来做到这一点

mydll = ctypes.CDLL('...')
del mydll
mydll = ctypes.CDLL('...')

编辑: 霍普的评论是正确的,这取消了名称的绑定,但是垃圾回收不会很快发生,实际上,我什至怀疑它是否会释放已加载的库。

Ctypes似乎没有提供一种干净的方式来释放资源,它仅提供了_handledlopen句柄的字段…

因此,我所看到的唯一,真正, 非常不干净的方法
是,系统地依赖dlclose句柄,但这是非常不干净的,因为ctypes在内部保留了对该句柄的引用。因此,卸载采用以下形式:

mydll = ctypes.CDLL('./mylib.so')
handle = mydll._handle
del mydll
while isLoaded('./mylib.so'):
    dlclose(handle)

太不干净了,我只检查了它是否可以使用:

def isLoaded(lib):
   libp = os.path.abspath(lib)
   ret = os.system("lsof -p %d | grep %s > /dev/null" % (os.getpid(), libp))
   return (ret == 0)

def dlclose(handle)
   libdl = ctypes.CDLL("libdl.so")
   libdl.dlclose(handle)


 类似资料:
  • 我需要取消扫描包含转义xml标记的xml字符串: 我确实找到了一些可以执行此任务的库,但我宁愿使用可以执行此任务的单个方法。 有人能帮忙吗? 干杯,Bas Hendriks

  • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)

  • 问题内容: 我在Mac(OS Mavericks)上安装了Python Anaconda。我想在Mac上恢复为默认版本的Python。最好的方法是什么?我应该删除目录吗?还需要其他更改吗? 目前,当我运行时,which python我会得到以下路径: 问题答案: 从文档: 要卸载,请打开终端窗口并删除整个安装目录:。您也可以编辑 和删除的森蚺目录PATH 的环境变量,并删除隐藏文件, 并可能已在主

  • 我在Mac(OS Mavericks)上安装了Python Anaconda。我想在Mac上恢复到Python的默认版本。最好的方法是什么?我应该删除目录吗?还有其他需要修改的地方吗? 目前,当我运行我得到这个路径: 用户/用户名/anaconda/bin/python

  • 问题内容: 我想从Mac OS X 10.6.4中完全删除Python 2.7。我设法PATH通过还原删除了变量中的条目.。但是我也想删除所有由python 2.7安装包安装的目录,文件,符号链接和条目。我从http://www.python.org/获得了安装软件包。我需要删除哪些目录/文件/配置文件条目?某处有清单吗? 问题答案: 不要试图删除任何苹果公司提供的系统的Python这是在y和,因

  • 问题内容: 您可以简单地从python安装中删除目录,还是必须删除任何残留文件? 问题答案: 它取决于您传递给的选项以及系统/软件包中distutils配置文件的内容。我不相信会以这些方式在指定目录之外修改任何文件。 值得注意的是,distutils目前没有卸载命令。 还值得注意的是,删除程序包/鸡蛋可能会导致依赖关系问题,例如尝试减轻此类问题的实用程序。