Python AttributeError:找不到函数“搜索”

时间:2016-09-07 18:16:53

标签: python windows anaconda ctypes

我正在尝试使用API​​控制Tektronix RSA306频谱分析仪。程序找到RSA300API.dll文件,但在搜索和连接到设备时会引发错误。我正在运行的程序是Tektronix的一个例子。我目前使用的设置是64位Windows 7上的Python 2.7.12 x64(Anaconda 4.1.1)。

from ctypes import *
import numpy as np
import matplotlib.pyplot as plt

我正在使用:

找到.dll文件
rsa300 = WinDLL("RSA300API.dll")

执行搜索功能时发生错误:

longArray = c_long*10
deviceIDs = longArray()
deviceSerial = c_wchar_p('')
numFound = c_int(0)
serialNum = c_char_p('')
nomenclature = c_char_p('')
header = IQHeader()

rsa300.Search(byref(deviceIDs), byref(deviceSerial), byref(numFound))
if numFound.value == 1:
   rsa300.Connect(deviceIDs[0])
else:
   print('Unexpected number of instruments found.')
   exit()

运行时出现以下错误消息:

C:\Anaconda2\python.exe C:/Tektronix/RSA_API/lib/x64/trial
<WinDLL 'RSA300API.dll', handle e47b0000 at 3ae4e80>
Traceback (most recent call last):
  File "C:/Tektronix/RSA_API/lib/x64/trial", line 44, in <module>
    rsa300.Search(byref(deviceIDs), byref(deviceSerial), byref(numFound))
  File "C:\Anaconda2\lib\ctypes\__init__.py", line 376, in __getattr__
    func = self.__getitem__(name)
  File "C:\Anaconda2\lib\ctypes\__init__.py", line 381, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'Search' not found

我遇到的问题是找不到“搜索”功能。这个问题的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

Tektronix应用工程师。

这里的问题是API版本不匹配。您的代码引用旧版本的API(RSA300API.dll),错误消息引用了较新版本的API(RSA_API.dll)。确保您已安装最新版本的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

为了清晰和一致,使用新版本中的功能名称。旧版本的API没有大多数函数的前缀,并且不清楚哪些函数只是通过读取函数名称而组合在一起。新版本的API将前缀应用于所有函数,现在通过阅读其声明,更容易分辨给定函数的功能组。例如,旧的搜索和连接函数简称为Search()和Connect(),新版本的函数称为DEVICE_Search()和DEVICE_Connect()。

注意:我使用cdll.LoadLibrary(“RSA_API.dll”)来加载dll而不是WinDLL()。

DEVICE_Search()与Search()的参数略有不同。由于参数数据类型不同,新的DEVICE_Search()函数不像旧的Search()函数那样使用ctypes,但我找到了一个有效的方法(参见下面的代码)。

这是我在RSA控制脚本开头使用的search_connect()函数:

from ctypes import *
import os

"""
################################################################
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")


"""#################CLASSES AND FUNCTIONS#################"""
def search_connect():
    #search/connect variables
    numFound = c_int(0)
    intArray = c_int*10
    deviceIDs = intArray()
    #this is absolutely asinine, but it works
    deviceSerial = c_char_p('longer than the longest serial number')
    deviceType = c_char_p('longer than the longest device type')
    apiVersion = c_char_p('api')

    #get API version
    rsa.DEVICE_GetAPIVersion(apiVersion)
    print('API Version {}'.format(apiVersion.value))

    #search
    ret = rsa.DEVICE_Search(byref(numFound), deviceIDs, 
        deviceSerial, deviceType)

    if ret != 0:
        print('Error in Search: ' + str(ret))
        exit()
    if numFound.value < 1:
        print('No instruments found. Exiting script.')
        exit()
    elif numFound.value == 1:
        print('One device found.')
        print('Device type: {}'.format(deviceType.value))
        print('Device serial number: {}'.format(deviceSerial.value))
        ret = rsa.DEVICE_Connect(deviceIDs[0])
        if ret != 0:
            print('Error in Connect: ' + str(ret))
            exit()
    else:
        print('Unexpected number of devices found, exiting script.')
        exit()