使用ctypes.WinDLL()的问题

时间:2015-12-10 16:28:10

标签: python ctypes

我正在努力让频谱分析仪程序示例正常工作但是在查找模块时遇到了问题。这是我得到的错误

Traceback (most recent call last):
  File "C:\Users\user\Documents\Programs\Python_program_example.py", line 10, in <module>
    rsa300 = ctypes.WinDLL("C:\\Tektronix\\RSA306 API\\lib\\x64\\RSA300API.dll")
  File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found

DLL存在且os.path.exists()使用该路径打印true所以我不确定问题是什么。有谁知道这有什么问题吗?

2 个答案:

答案 0 :(得分:2)

RSA300API.DLL可能在文件夹中有依赖项,因此在使用它之前,请使用os.chdir设置工作目录,例如:

import os

os.chdir(r'C:\Tektronix\RSA306 API\lib\x64')
rsa300 = ctypes.WinDLL(r"C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll")

选中其中一个samples,这似乎是推荐的访问方式。

或者,正如@eryksub所提到的,可以使用LoadLibraryExwin32api可用于获取句柄并将其传递给WinDLL,如下所示:

import ctypes
import win32api
import win32con

dll_name = r'C:\Tektronix\RSA306 API\lib\x64\RSA300API.dll'
dll_handle = win32api.LoadLibraryEx(dll_name, 0, win32con.LOAD_WITH_ALTERED_SEARCH_PATH)
rsa300 = ctypes.WinDLL(dll_name, handle=dll_handle)

答案 1 :(得分:1)

Tektronix应用工程师。

Martin是正确的,我们的dll 在它所在的文件夹中具有依赖关系。看起来您正在使用旧版本的API,它在C:\ Tektronix \ RSA306 API \ lib \ x64文件夹中有一整套依赖项。较新版本的API清除并整合了许多依赖项,并重命名了许多功能以提高清晰度和一致性。我们的软件工程师还决定在安装较新版本时不会覆盖旧的API,因此即使安装了最新的API,旧脚本仍然可以正常工作。

FWIW,我在所有RSA控制脚本的开头使用以下代码:

"""
################################################################
C:\Tektronix\RSA306 API\lib\x64 needs to be added to the 
PATH system environment variable
################################################################
"""
os.chdir("C:\\Tektronix\\RSA_API\\lib\\x64")
rsa = cdll.LoadLibrary("RSA_API.dll")

以下链接可下载最新版本的RSA API(截至11/1/16): http://www.tek.com/model/rsa306-software

以下是下载API文档的链接(截至11/1/16)。本文档附有一个Excel电子表格,概述了旧功能和新功能之间的区别: http://www.tek.com/spectrum-analyzer/rsa306-manual-6