ctypes 操作 python 与 c++ dll 互传结构体指针
Posted 佩雷尔曼的信徒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ctypes 操作 python 与 c++ dll 互传结构体指针相关的知识,希望对你有一定的参考价值。
CMakeLists.txt
# project(工程名) project(blog-3123958139-1) # add_library(链接库名称 SHARED 链接库代码) add_library(dll_ SHARED dll_.cpp)
dll_.cpp
#include <iostream> using namespace std; // c++ 结构体定义 struct cpp_struck_ { // 股票代码,字符串 char *stock_name_; // 日期,字符串数组 char *stock_date_[]; // 开高低收四组价格,浮点型数组 double stock_open_[]; double stock_high_[]; double stock_low_[]; double stock_close_[]; // 成交量,浮点型数组 double stock_volume_[]; // 长度,整型 int stock_len_; int ma_len_; }; // 声明为标准 C 格式导出的函数 extern "C" { // 传入结构体指针,传出结构体指针 cpp_struck_ *dll_function_1(cpp_struck_ *py_struck_pointer_) { /* * 数据处理部分... * * * */ cpp_struck_ *cpp_struck_pointer_; cpp_struck_pointer_ = py_struck_pointer_; return cpp_struck_pointer_; } }test_dll_.py
import tushare from ctypes import * # 下载测试数据 sh_data_frame_ = tushare.get_hist_data(\'sh\') stock_name_ = \'sh\' stock_date_ = sh_data_frame_.index.values stock_open_ = sh_data_frame_[\'open\'].values stock_high_ = sh_data_frame_[\'high\'].values stock_low_ = sh_data_frame_[\'low\'].values stock_close_ = sh_data_frame_[\'close\'].values stock_volume_ = sh_data_frame_[\'volume\'].values stock_len_ = len(sh_data_frame_) ma_len_ = 2 # 打印旧数据作为比较 print("old_date_ = ", list(stock_date_)) print("old_open_ = ", list(stock_open_)) # python 结构体定义 class py_struct_(Structure): _fields_ = [("stock_name_", c_wchar_p), # 注意字符串格式要用 c_wchar_p 而不是 c_char_p ("stock_date_", c_wchar_p * stock_len_), ("stock_open_", c_double * stock_len_), ("stock_high_", c_double * stock_len_), ("stock_low_", c_double * stock_len_), ("stock_close_", c_double * stock_len_), ("stock_volume_", c_double * stock_len_), ("stock_len_", c_int), ("ma_len_", c_int)] # python 结构体实例化,初始化 py_struct_1 = py_struct_() py_struct_1.stock_name_ = stock_name_ py_struct_1.stock_date_ = (c_wchar_p * stock_len_)(*stock_date_) py_struct_1.stock_open_ = (c_double * stock_len_)(*stock_open_) # 传入指针实例 py_struct_1_pointer_ = byref(py_struct_1) # 获取 dll 句柄 h_dll_ = CDLL( \'C:\\\\Users\\\\Perelman\\\\.CLion2016.1\\\\system\\\\cmake\\\\generated\\\\blog-3123958139-1-6c04ac5e\\\\6c04ac5e\\\\Debug\\\\libdll_.dll\') # 定义 dll 返回值类型为 python 结构体指针 h_dll_.dll_function_1.restype = POINTER(py_struct_) # 返回 dll 结构体指针 cpp_struct_pointer_ = h_dll_.dll_function_1(py_struct_1_pointer_) # 结构体指针取内容 cpp_struct_contents_ = cpp_struct_pointer_.contents # 保存结果为 python list 格式 new_date_ = [] for value in cpp_struct_contents_.stock_date_: new_date_.append(value) print("new_date_ = ", new_date_) # 保存结果为 python list 格式 new_open_ = [] for value in cpp_struct_contents_.stock_open_: new_open_.append(value) print("new_open_ = ", new_open_)
以上是关于ctypes 操作 python 与 c++ dll 互传结构体指针的主要内容,如果未能解决你的问题,请参考以下文章
将 C++ 中的“extern C”与 ctypes 的向量一起使用
WindowsError 异常访问冲突 - 在简单的 python c++ ctypes 接口中
python3使用ctypes在windows中访问C和C++动态链接库函数示例