我的最终目标是在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 ......所以我做错了什么?我无法弄清楚如何调用头文件中列出的任何函数。
答案 0 :(得分:2)
你确定它是WinDLL吗?从头文件,它看起来像我的标准C调用约定。您是否尝试过CDLL
?
修改强>:
我现在看到了。你指向的标题实际上并不是nvapi.dll
的接口 - 它是一个必须静态链接的包装器。
从NVIDIA's developer site下载的文档:
使用带应用程序的静态链接
NvAPI无法动态链接到应用程序。您必须创建一个到库的静态链接,然后调用NvAPI_Initialize(),它会动态加载nvapi.dll。
如果系统上未安装NVIDIA驱动程序或应用程序调用NvAPI_Initialize()时nvapi.dll不存在,则调用只会返回错误。应用程序仍将加载。
我猜想nvapi.dll
中的实际调用与此封装库中公开的调用完全不同。我似乎无法找到任何关于这些的文档。也许它们是内部的,并且在系统之间发生变化。
如果您想使用此界面,我不确定最佳解决方案是什么。它是一个静态库而不是动态库,所以除非你把它包装在另一个DLL中,否则ctypes不会处理它。我不是使用Python的本机代码的专家,所以也许其他人可以轻松修复。遗憾。
答案 1 :(得分:0)
取自你的评论:
NvAPI_Initialize调用仍然失败。 说找不到这个功能。
NvAPI_Initialize
未从动态库nvapi.dll导出。它是nvapi.lib中包含的符号,这是NVIDIA SDK附带的静态库,因此难怪您无法使用Python调用它。
老实说,这里最简单的方法是在C中创建一个小包装器DLL,静态链接到nvapi.lib并向Python公开友好的接口。