開發自動化工具過程當中,須要使用專業的測試射頻參數的儀器IQmeasure,廠家提供的API只用C ++版本。
客戶端使用python(wxpython)開發,因此遇到了python調用C ++類庫的問題。html
ctypes的python官方文檔python
使用前請先瀏覽ctypes官方文檔工具
test
├── IQmeasure_SCPI.dll
├── venv
└── main.py學習
from ctypes import * # 加載dll包 iq = cdll.LoadLibrary('./IQmeasure_SCPI.dll') # 調用方法 init_result = iq.LP_Init(c_int(0), c_int(1)) print('init_result:', init_result) # init_result: 0 # 該方法中,返回0爲成功 # 原C++文檔中,該方法以下: # int LP_Init(int IQtype = IQTYPE_XEL,int testerControlMethod = 1);
from ctypes import * # 加載dll包 iq = cdll.LoadLibrary('./IQmeasure_SCPI.dll') # 有返回值 # 設置返回值類型 iq.LP_GetErrorString.restype = c_char_p # 設置初始值類型 iq.LP_GetErrorString.argtypes = [c_int] msg = iq.LP_GetErrorString(c_int(10)) print(msg) # b'Invalid analysis type' # 轉換爲string str_msg = msg.decode("utf-8") print(str_msg) # VSA number is out of range. Try 1-4. # 原C++文檔中,該方法以下: # char* LP_GetErrorString(int err)
簡單得查了資料,帶 好像是指針類型吧,開發着急因此沒有深刻學習了,相似int , char * 這樣的測試
# ...省略加載dll # 參數值爲*類型 # 使用byref(),包裝對應類型便可 iq.LP_SetTesterMode(c_int(0), byref(c_int(1)), c_int(1)) # 原C++文檔中,該方法以下: # int LP_SetTesterMode( int signalMode = UP_TO_80MHZ_SIGNAL, int *selectedModules = NULL, int numOfSelectedModules = 1 );
# ...省略加載dll version = create_string_buffer(4096) iq.LP_GetVersion(version, 4096) version_result = version.value.decode("utf-8") # 原C++文檔中,該方法以下: # 該方法會改變*buffer,python中須要讀取*buffer的值 # bool LP_GetVersion(char *buffer, int buf_size);
from ctypes import * # 加載dll包 iq = cdll.LoadLibrary('./IQmeasure_SCPI.dll') # 調用方法 init_result = iq.LP_Init(c_int(0), c_int(1)) print('init_result:', init_result) # init_result: 0 # 該方法中,返回0爲成功 # 原C++文檔中,該方法以下: # int LP_Init(int IQtype = IQTYPE_XEL,int testerControlMethod = 1); # 有返回值 # 設置返回值類型 iq.LP_GetErrorString.restype = c_char_p # 設置初始值類型 iq.LP_GetErrorString.argtypes = [c_int] msg = iq.LP_GetErrorString(c_int(10)) print(msg) # b'Invalid analysis type' # 轉換爲string str_msg = msg.decode("utf-8") print(str_msg) # VSA number is out of range. Try 1-4. # 原C++文檔中,該方法以下: # char* LP_GetErrorString(int err) # 參數值爲*類型 # 使用byref(),包裝對應類型便可 iq.LP_SetTesterMode(c_int(0), byref(c_int(1)), c_int(1)) # 原C++文檔中,該方法以下: # int LP_SetTesterMode( int signalMode = UP_TO_80MHZ_SIGNAL, int *selectedModules = NULL, int numOfSelectedModules = 1 ); version = create_string_buffer(4096) iq.LP_GetVersion(version, 4096) version_result = version.value.decode("utf-8") # 原C++文檔中,該方法以下: # 該方法會改變*buffer,python中須要讀取*buffer的值 # bool LP_GetVersion(char *buffer, int buf_size);
由於對C ++不甚瞭解,對C ++部分的解釋、名詞有誤差,水平限制勿怪,歡迎私信糾正。指針
內容爲本人和駱小萍同窗在開發實踐中獲得rest
以上日誌