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_)

时间: 2024-11-04 13:34:33

ctypes 操作 python 与 c++ dll 互传结构体指针的相关文章

python 传递结构体指针到 c++ dll

CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED xxx.cpp) xxx.cpp #include <iostream> using namespace std; // c++ 结构体定义 struct struck_ { // 股票名,字符串 char * stock_code_; // 开盘价 double stock_open_; };

C# 调用C++DLL 传结构体数组

C# 调用C++DLL 传结构体数组,注意C#和C++数据类型占用字节数要对应.否则传进去的数组会错位.C++ BOOL 对应C#bool. 1.c++代码 //MyDLL.h #ifndef MYDLL_H_ #define MYDLL_H_ #include <iostream> #include <windows.h> #ifdef EXTERN_EXPORT #define EXTERN_EXPORT extern "C" _declspec(dllim

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

结构体指针传参与返回值

结构体指针 结构体指针大家想必都非常清楚,我们也一直强调传参的时候使用结构体指针(占用4字节),减少对栈的压力.但是今天看linux的标准io时候.发现了localtime时间函数 返回值是一个结构体指针.当时有点懵逼了,开始觉得这样就不对.{当然肯定是我想多了} 为什么会觉得不对那?因为它是个子函数,返回一个局部变量的地址显然是没有价值的.函数调用完就被释放了呀.你在用指针承接也没有价值,完全是野指针啊.百度了一下还真的有人在么做,结果出现了问题.但是其实我的想法是错误的.人家大神怎么可能犯这

结构体指针作函数参数(C# 调用C++ 的DLL)

1.C++结构体定义: #pragma pack(1) struct Person {     #define Count_favoriteNumbers 6      int id;      float favoriteNumbers[Count_favoriteNumbers]; }; #pragma pack()        // #pragma pack(1) end C++ 导出函数: #define DllExport extern "C" __declspec(dll

Qt socket中怎么传结构体?

直接发送和接收结构体,例如:struct A {...};struct A objectA; 发送的时候: tcpSocket->write((char *)&objectA, sizeof(objectA));  接收的时候:struct A objectB;tcpSocket->read((char *)&objectA, sizeof(objectA)); http://blog.csdn.net/emdfans/article/details/23869325

Linux C语言下TCP传结构体

1.废话不多说,本文介绍的是Linux下C语言实现TCP传递结构体数据: a.TCP Server一直在等待接收数据 b.TCP Client发送结构体数据 c.TCP Server接收数据并解析出来 2.结构体介绍: a.实际上要发送的结构体是: struct TCP_STRUCT_DATA{int m_cmd;//命令 可以用宏定义或者枚举区分不同的命令int m_data_len;//要发的数据的长度char *data;//要发的数据}DATA_SEND, *PDATA_SEND; b.

使用offsetof对结构体指针偏移操作

题目来自于COMP20003 Tutorial 2: Program m ing Challenge 2.2 The technology stack at Hidebound Inc. uses a subset of C w hich doesn't have the '.' or '->'operators, as the higher-ups heard shortcuts like this w ere useful in an activity called "code gol

ctypes给扩展模块中的函数传递数组和结构体

传递数组 楔子 下面我们来看看如何使用ctypes传递数组,这里我们只讲传递,不讲返回.因为C语言返回数组给python实际上会存在很多问题,比如:返回的数组的内存由谁来管理,不用了之后空间由谁来释放,事实上ctypes内部对于返回数组支持的也不是很好.因此我们一般不会向python返回一个C语言中的数组,因为C语言中的数组传递给python涉及到效率的问题,python中的列表传递直接传递一个引用即可,但是C语言中的数组过来肯定是要拷贝一份的,所以这里我们只讲python如何通过ctypes给