使用Python ctypes和NVAPI的帮助

5
我的最终目标是在Python中查询NVAPI的GPU使用情况和其他统计信息。请参见http://developer.nvidia.com/nvapi
from ctypes import WinDLL
nvapi = WinDLL("nvapi.dll")
print nvapi# <WinDLL 'nvapi.dll', handle 718a0000 at 27c0050>
print nvapi.nvapi_QueryInterface# <_FuncPtr object at 0x026D8E40>
print nvapi.nvapi_QueryInterface()# returns 0
print nvapi.NvAPI_Initialize# AttributeError: function 'NvAPI_Initialize' not found
print nvapi.NvAPI_SYS_GetChipSetInfo# AttributeError: function 'NvAPI_SYS_GetChipSetInfo' not found

这是一个可以从上面链接下载的头文件副本:http://paste.pound-python.org/show/7337/

目前,我只是在尝试熟悉api......那么我做错了什么?我无法弄清如何调用头文件中列出的任何函数。


我在这里发布了一个后续问题:https://dev59.com/wFfUa4cB1Zd3GeqPKa8M - user319862
2个回答

2
你确定这是一个WinDLL吗?从头文件来看,它对我来说看起来像是标准的C调用约定。你尝试过使用CDLL吗?
编辑:
我现在明白了。你指出的头文件实际上并不是nvapi.dll的接口 - 它是一个必须静态链接的包装器。
NVIDIA开发者网站下载的文档中可以看到:
使用应用程序的静态链接 NvAPI不能动态链接到应用程序。您必须创建与库的静态链接,然后调用NvAPI_Initialize(),它会动态加载nvapi.dll。 如果系统上没有安装NVIDIA驱动程序或应用程序在调用NvAPI_Initialize()时不存在nvapi.dll,则该调用只会返回错误。应用程序仍将被加载。
我猜测,实际上在nvapi.dll中的调用与这个包装库中公开的调用完全不同。但我似乎找不到任何关于它们的文档。也许它们是内部的,并且在不同的系统之间会有所改变。
如果你想使用这个界面,我不太确定最好的解决方案是什么。它是一个静态库而不是动态库,所以 ctypes 无法处理它,除非你将其包装在另一个 DLL 中。我不是 Python 的本地代码专家,也许其他人会有一个简单的解决方案。抱歉。

我也尝试了CDLL,但它也不起作用。 <CDLL 'nvapi.dll',句柄为71890000,位于26f8030> <_FuncPtr object at 0x02608EB8> 0 但是随后出现AttributeError错误:找不到函数“NvAPI_Initialize”。 - user319862
对不起,我的格式混乱了。前三个打印工作并显示类似的输出,但NvAPI_Initialize调用仍然失败,显示函数未找到。 - user319862

0

来自您的评论:

NvAPI_Initialize 调用仍然失败。 提示找不到该函数。

NvAPI_Initialize 没有从动态库 nvapi.dll 中导出。它是包含在 NVIDIA SDK 中的静态库 nvapi.lib 中的符号,因此您无法使用 Python 调用它也就不足为奇了。

老实说,在这里最简单的方法是创建一个小型的 C 包装 DLL,静态链接到 nvapi.lib 并向 Python 公开友好的接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接