我的最终目标是在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...那么我到底做错了什么呢?我不知道如何调用头文件中列出的任何函数。
发布于 2011-05-29 06:37:53
摘自你的评论:
NvAPI_Initialize调用仍然失败。说找不到函数。
不会从动态库nvapi.dll中导出NvAPI_Initialize。它是NVIDIA SDK附带的静态库nvapi.lib中包含的符号,因此您无法使用Python调用它也就不足为奇了。
老实说,这里最简单的方法是用C语言创建一个小的包装器DLL,静态链接到nvapi.lib,并向Python公开一个友好的接口。
发布于 2011-05-29 05:32:58
你确定是WinDLL吗?从头文件看,它看起来像是一个标准的C调用约定。你有没有尝试过CDLL呢?
编辑
我现在明白了。您所指向的头实际上并不是nvapi.dll的接口--它是必须静态链接的包装器。
从NVIDIA's developer site下载的文档
通过Applications使用静态链接
NvAPI不能动态链接到应用程序。您必须创建一个指向该库的静态链接,然后调用动态加载nvapi.dll的NvAPI_Initialize()。
如果系统上未安装NVIDIA驱动程序,或者应用程序调用NvAPI_Initialize()时nvapi.dll不存在,则该调用将返回错误。应用程序仍将加载。
我猜nvapi.dll中的实际调用与这个包装器库中公开的完全不同。不过,我似乎找不到任何关于这些的文档。也许它们是内部的,并且在系统之间变化。
如果你想使用这个接口,我真的不确定最好的解决方案是什么。它是一个静态库,而不是一个动态库,所以除非您将它包装在另一个DLL中,否则ctype不会处理它。我不是Python原生代码方面的专家,所以也许其他人会有一个简单的修复方法。抱歉的。
https://stackoverflow.com/questions/6163770
复制相似问题