帮助解决python ctypes和nvapi的问题

5 投票
2 回答
1464 浏览
提问于 2025-04-16 18:32

我的最终目标是用Python查询NVAPI来获取显卡使用情况和其他统计数据。你可以查看这个链接了解更多信息: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……那么我哪里做错了呢?我搞不清楚怎么调用头文件中列出的任何函数。

2 个回答

2

你确定这是一个WinDLL吗?从这个头文件来看,我觉得它看起来像是一个标准的C语言调用方式。你有没有试过用CDLL呢?

编辑:

我现在明白了。你提到的那个头文件其实并不是nvapi.dll的接口——它是一个包装器,必须静态链接。

根据从NVIDIA开发者网站下载的文档:

与应用程序使用静态链接

NvAPI不能动态链接到应用程序。你必须创建一个静态链接到这个库,然后调用NvAPI_Initialize(),这个函数会动态加载nvapi.dll。

如果系统上没有安装NVIDIA驱动程序,或者在应用程序调用NvAPI_Initialize()时找不到nvapi.dll,这个调用就会返回一个错误。不过,应用程序还是会加载。

我猜nvapi.dll里面的实际调用和这个包装库中暴露的调用是完全不同的。不过我找不到关于这些的任何文档。也许它们是内部的,并且在不同的系统之间会有所变化。

如果你想使用这个接口,我不太确定最好的解决方案是什么。它是一个静态库,而不是动态库,所以ctypes处理不了,除非你把它包装成另一个DLL。我对用Python处理本地代码不是很在行,也许其他人会有简单的解决办法。抱歉。

0

根据你的评论:

NvAPI_Initialize 调用仍然失败,提示找不到这个函数。

NvAPI_Initialize 这个函数并不是从动态库 nvapi.dll 中导出的。它实际上是包含在 nvapi.lib 这个静态库里的,而这个静态库是和 NVIDIA 的开发工具包一起提供的。所以你用 Python 调用它的时候找不到也是正常的。

老实说,最简单的办法是用 C 语言创建一个小的包装 DLL,这样可以静态链接到 nvapi.lib,并且给 Python 提供一个更友好的接口。

撰写回答