帮助解决python ctypes和nvapi的问题
我的最终目标是用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 个回答
你确定这是一个WinDLL吗?从这个头文件来看,我觉得它看起来像是一个标准的C语言调用方式。你有没有试过用CDLL
呢?
编辑:
我现在明白了。你提到的那个头文件其实并不是nvapi.dll
的接口——它是一个包装器,必须静态链接。
根据从NVIDIA开发者网站下载的文档:
与应用程序使用静态链接
NvAPI不能动态链接到应用程序。你必须创建一个静态链接到这个库,然后调用NvAPI_Initialize(),这个函数会动态加载nvapi.dll。
如果系统上没有安装NVIDIA驱动程序,或者在应用程序调用NvAPI_Initialize()时找不到nvapi.dll,这个调用就会返回一个错误。不过,应用程序还是会加载。
我猜nvapi.dll
里面的实际调用和这个包装库中暴露的调用是完全不同的。不过我找不到关于这些的任何文档。也许它们是内部的,并且在不同的系统之间会有所变化。
如果你想使用这个接口,我不太确定最好的解决方案是什么。它是一个静态库,而不是动态库,所以ctypes处理不了,除非你把它包装成另一个DLL。我对用Python处理本地代码不是很在行,也许其他人会有简单的解决办法。抱歉。
根据你的评论:
NvAPI_Initialize
调用仍然失败,提示找不到这个函数。
NvAPI_Initialize
这个函数并不是从动态库 nvapi.dll 中导出的。它实际上是包含在 nvapi.lib 这个静态库里的,而这个静态库是和 NVIDIA 的开发工具包一起提供的。所以你用 Python 调用它的时候找不到也是正常的。
老实说,最简单的办法是用 C 语言创建一个小的包装 DLL,这样可以静态链接到 nvapi.lib,并且给 Python 提供一个更友好的接口。