Boost.Python的简单使用

Python调C函数

C端定义

char const * hello()
{
    return "hello,world";

}

BOOST_PYTHON_MODULE(hello)
{
    def("hello", hello);
}

python端调用

import hello
print hello.hello()

Python中

//用于线程安全
class PyLock
{
private:
	PyGILState_STATE gil_state;

public:
	//在某个函数方法中创建该对象时,获得GIL锁
	PyLock()
	{
		gil_state = PyGILState_Ensure();
	}

	//在某个函数完成后销毁该对象时,解放GIL锁
	~PyLock()
	{
		PyGILState_Release(gil_state);
	}
};


class MD_Client : public wrapper<Client>
{
public:
	MD_Client();
	virtual ~MD_Client();


    virtual void pyNotify(int,string ss);
    virtual void pyResponse(int,string ss);
    virtual void pyRequest(int,string ss);
    virtual void update_data(int,int ,string ss);

    virtual void login(string user,string passwd,string ip,int port);

    virtual void subScribeMarketData(string ss,int);

    virtual void exit();

public:
	void Lock();
	void Unlock();
private:



};


BOOST_PYTHON_MODULE(PyClient){
        PyEval_InitThreads();	//导入时运行,保证先创建GIL
        class_<MD_Client, boost::noncopyable>("CppPython")
        .def("login",&MD_Client::login)
        .def("subScribeMarketData",&MD_Client::subScribeMarketData)
        .def("update_data",pure_virtual(&MD_Client::update_data))
        .def("pyNotify",pure_virtual(&MD_Client::pyNotify))
        .def("pyResponse",pure_virtual(&MD_Client::pyResponse))
        .def("pyRequest",pure_virtual(&MD_Client::pyRequest))
        .def("exit",&MD_Client::exit);

}









//C++ 回调python方法
void MD_Client::update_data(int, int cmd, string ss)
{
    PyLock lock;
    try
    {
        get_override("update_data")(0,cmd,ss);
    }
    catch (error_already_set const &)
    {
        PyErr_Print();
    }
}

void MD_Client::pyNotify(int cmd, string ss)
{
    PyLock lock;
    try
    {
        get_override("pyNotify")(cmd,ss);
    }
    catch (error_already_set const &)
    {
        PyErr_Print();
    }
}

void MD_Client::pyRequest(int cmd, string ss)
{
    PyLock lock;
    try
    {
        get_override("pyRequest")(cmd,ss);
    }
    catch (error_already_set const &)
    {
        PyErr_Print();
    }
}

void MD_Client::pyResponse(int cmd, string ss)
{
    PyLock lock;
    try
    {
        get_override("pyResponse")(cmd,ss);
    }
    catch (error_already_set const &)
    {
        PyErr_Print();
    }
}

void MD_Client::subScribeMarketData(string id,int yes){
    E15_ClientMsg cmd;
    if( yes )
        cmd.cmd = Stock_Msg_SubscribeById;
    else
        cmd.cmd = Stock_Msg_UnSubscribeById;
    cmd.status = 0;
    E15_ValueTable vt;
    E15_Value * v = vt.InsertS("id_list");
    v->Init(E15_Value::Value_STRINGARRAY);
    v->AppendBytes(id.c_str(),-1);
    E15_String s;
    vt.Print(); v->Print();
    vt.Dump(&s);
    E15_Debug::Printf(0," dingyue %s %s  %ld\n",id.c_str(),s.c_str(),s.Length());
    Request(&g_infoSeverId,&cmd,s.c_str(),s.Length());
}

void MD_Client::login(string user,string passwd,string ip,int port){
    g_socket = new E15_Socket;
    g_socket->Start();
    Start(g_socket);
    E15_ClientInfo client ;
    memset(&client,0,sizeof(E15_ClientInfo));
    client.role = "tttttt";
    client.name = user.c_str();
    client.pwd = passwd.c_str();
    Login(&client, "",ip.c_str(), port);
    g_infoSeverId = client.id;
}

void MD_Client::exit(){
    Stop();
    g_socket->Stop();
    delete g_socket;
}


Python端使用:Python 端导入此模块。实现一个接口类继承C++端的MD_Client类

# encoding: utf-8

import sys
from time import sleep

from PyQt5.QtCore import QObject, QFile, QTextStream
import json
import locale
from MainWindow import *
from md_client import *
from PyQt5 import QtWidgets
from signals import *


def main():
    app = QtWidgets.QApplication(sys.argv)
    QApplication.setQuitOnLastWindowClosed(True)

    file = QFile("dev.css");
    if (file.open(QFile.ReadOnly)):
        styleIn = QTextStream(file)
        qss = styleIn.readAll()
        qApp.setStyleSheet(qss)
        file.close()

    g_signals = Signals()

    api = CppPythonClient(g_signals)
    api.login('test','123456','127.0.0.1',10001)
    w = MainWindow(g_signals,api)
    w.setWindowTitle("客户端Python版")
    w.showMaximized()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()










from PyClient import *

from stock_msg import *
import json
from MainWindow import *
class CppPythonClient(CppPython):
    def __init__(self,g_signals):
        """Constructor"""
        super(CppPythonClient, self).__init__()
        self.g_signals = g_signals

    def pyNotify(self,cmd,json_str):
        print (json_str)
        print ("dasagssgag")

    def pyResponse(self ,cmd,json_str):
        print (json_str)

    def pyRequest(self,cmd,json_str):
        print (json_str)

    def resolve_InstrumentList(self, id_list):
        id_json = json.loads(id_list,encoding='utf-8')
        # id_json = json.dumps(id_list,ensure_ascii=False)
        # print (id_json);
        self.g_signals.send_id_list.emit(id_json)

        # for val in id_json
        # :
        #     print val,id_json[val]['name']

    def update_data(self,a,cmd,json_str):
        print (json_str,cmd)
        if(cmd==1):
            self.resolve_InstrumentList(json_str)
        elif(cmd==3):
            self.resolve_DiagramInfo(json_str)
            print(json_str, cmd)
            self.subScribeMarketData('j1901', 1)
        elif(cmd==Stock_Msg.Stock_Msg_DiagramGroup):
            print (json_str)



    def resolve_DiagramInfo(self,json_str):
        diagranInfo = json.loads(json_str,encoding='utf-8')
        for var in diagranInfo:
            print (var,diagranInfo[var])

猜你喜欢

转载自blog.csdn.net/qq_16778399/article/details/82379406