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