【问题标题】:help with python ctypes and nvapi帮助 python ctypes 和 nvapi
【发布时间】:2011-05-28 18:55:49
【问题描述】:

我的最终目标是在 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……那我做错了什么?我不知道如何调用头文件中列出的任何函数。

【问题讨论】:

标签: python ctypes


【解决方案1】:

你确定它是 WinDLL 吗?从头文件来看,它对我来说就像一个标准的 C 调用约定。你试过CDLL吗?

编辑

我现在明白了。您指向的标头实际上不是nvapi.dll 的接口——它是一个必须静态链接的包装器。

来自NVIDIA's developer site下载的文档:

在应用程序中使用静态链接

NvAPI 不能动态链接到应用程序。您必须创建到库的静态链接,然后调用 NvAPI_Initialize(),它会动态加载 nvapi.dll。

如果系统上未安装 NVIDIA 驱动程序或应用程序调用 NvAPI_Initialize() 时不存在 nvapi.dll,则该调用只会返回错误。该应用程序仍将加载。

我猜nvapi.dll 中的实际调用与此包装库中公开的调用完全不同。不过,我似乎找不到任何关于这些的文档。也许它们是内部的并且在系统之间发生变化。

如果您想使用此界面,我不确定最好的解决方案是什么。它是一个静态库而不是动态库,因此 ctypes 不会处理它,除非您将它包装在另一个 DLL 中。我不是 Python 本地代码方面的专家,所以也许其他人会有一个简单的解决方法。对不起。

【讨论】:

  • 我也试过 CDLL。它也不起作用。 <_funcptr object at> 0 但随后出现 AttributeError 错误:未找到函数 'NvAPI_Initialize'
  • 对不起,我的格式搞砸了。前三个打印工作并显示类似的输出,但 NvAPI_Initialize 调用仍然失败。说找不到函数。
【解决方案2】:

取自您的评论:

NvAPI_Initialize 调用仍然失败。 说找不到函数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2011-06-10
    • 2021-11-07
    • 2011-06-09
    相关资源
    最近更新 更多