最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试;

因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给游戏服务器,响应消息再交由python进行校验;

开始:

首先是c++调用python这一层需要打通;

幸运的是python自己有一套库提供c/c++进行调用;

下面我贴代码;用的vs2013,python用的2.7

 // python_c++.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <Python.h>
#pragma comment(lib, "Ws2_32.lib") int _tmain(int argc, _TCHAR* argv[])
{
// 初始化Python
Py_Initialize();
// 检查初始化是否成功
if (!Py_IsInitialized()) {
return -;
}
// 添加当前路径
//把输入的字符串作为Python代码直接运行,返回0
//表示成功,-1表示有错。大多时候错误都是因为字符串中有语法错误。
PyRun_SimpleString("import sys");
int result = PyRun_SimpleString("print('----------import sys-------')");
if (result!=-){
printf("test pyhon OK!\n\n");
} PyRun_SimpleString("sys.path.append('./')"); // 载入名为pytest的脚本
PyObject *pName = PyBytes_FromString("pytest");
PyObject *pModule = PyImport_Import(pName);
if (!pModule) {
printf("can't find pytest.py");
getchar();
return -;
} PyObject *pDict = PyModule_GetDict(pModule);
if (!pDict) {
getchar();
return -;
} //下面这段是查找函数test 并执行test
PyObject *pFunc = PyDict_GetItemString(pDict, "test2");
if (!pFunc || !PyCallable_Check(pFunc)) {
printf("can't find function [test2]");
getchar();
return -;
} typedef struct header_ {
int buf1;
int buf2;
char buf3[];
int buf4;
}header; //创建结构体
header input;
memset(&input,,sizeof(input));
input.buf1 = ;
input.buf2 = ;
input.buf4 = ;
strcpy_s(input.buf3, "kjac"); //打包成byte*
char * byInput = new char(sizeof(input));
memcpy(byInput, &input, sizeof(input)); //申请python入参
PyObject *pArgs = PyTuple_New();
//对python入参进行赋值; s代表char*格式, #代表传入指定长度
PyTuple_SetItem(pArgs, , Py_BuildValue("s#", byInput, sizeof(input))); //执行函数
PyObject *pResult = PyObject_CallObject(pFunc, pArgs); char* pRsp;
//获取返回值
PyArg_Parse(pResult, "s", &pRsp); //转成结构体
header* pstRsp = (header*)pRsp;
printf("\n-----------c++层接收py返回:buf1:%d,buf2:%d,buf3:%s,buf4:%d\n",
pstRsp->buf1, pstRsp->buf2, pstRsp->buf3, pstRsp->buf4); //释放
Py_DECREF(pName);
Py_DECREF(pArgs);
Py_DECREF(pModule); // 关闭Python
Py_Finalize();
getchar();
return ;
}

下面的是python代码

 import struct

 def test(a):
print("----------------------------python 1-----------------------")
ret = struct.unpack('ii11si', a)
print("----------------------------python deal-----------------------")
print("--------------------python receive c++ struct:")
print("begin unpack:")
print("")
print(ret)
buf1 = ret[0] + 1
buf2 = ret[1] + 1
buf4 = ret[3] + 1
print("--------------------begin pack data and begin send to c++")
print("")
bin_buf_all = struct.pack('ii11si', buf1, buf2, "dfds", buf4)
print("----------------------------python end-----------------------")
return bin_buf_all

下面附上vs2013的工程属性修改

设置python工程的include路径和libs路径

接下来;就可以编译输出了;

----------import sys-------
test pyhon OK! ----------------------------python 1-----------------------
----------------------------python deal-----------------------
--------------------python receive c++ struct:
begin unpack: (1, 2, 'kjac\x00\xfe\xfe\xfe\xfe\xfe\xfe', 3)
--------------------begin pack data and begin send to c++ ----------------------------python end----------------------- -----------c++层接收py返回:buf1:2,buf2:3,buf3:dfds,buf4:4

现在c++调用python已经大功告成了;下面就是python和c++之间的框架消息及测试代码的构造

c++调用python系列(1): 结构体作为入参及返回结构体的更多相关文章

  1. Oracle PLSQL Demo - 29.01.Function结构模板 [无入参] [有返回]

    CREATE OR REPLACE FUNCTION function_name RETURN DATE AS v_date DATE; BEGIN ; dbms_output.put_line(v_ ...

  2. jdbcTemplate 调用存储过程。 入参 array 返回 cursor

    注:本文来源<   jdbcTemplate 调用存储过程. 入参 array 返回 cursor   > 需求: java传入一个list object.从数据库找到相关的数据并返回. ...

  3. python函数入参和返回值

    以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html ...

  4. java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  5. Java调用Python相关问题:指定python环境、传入参数、返回结果

    本篇文章涉及到的操作均在Windows系统下进行,Java调用python在原理上不难,但是可能在实际应用中会有各种各样的需求,网上其他的资料很不全,所以又总结了这篇文章,以供参考. 一.指定pyth ...

  6. 通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  7. 嵌入Python系列 | 调用Python模块中无参数函数

    开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...

  8. VC 调用 Python

    //file:py.h BOOL InitPython(); BOOL ClosePython(); ======================== //file:py.cpp #include & ...

  9. 学习笔记之盘一盘 Python 系列 1 & 2 - 入门篇

    盘一盘 Python 系列 1 & 2 - 入门篇 https://mp.weixin.qq.com/s?__biz=MzIzMjY0MjE1MA==&mid=2247486473&a ...

随机推荐

  1. PowerShell管道入门,看看你都会不(管道例子大全)

    PowerShell的一个重中之重的功能就是管道(pipeline),本文从浅入深,一步一步详解管道的使用方法和例子,来看看有没有你所不知道的吧,如果全知道,恭喜你已经很厉害啦--适用于所有Power ...

  2. 一天搞定CSS:层级(z-index)--18

    因为定位的出现,所以有了元素重叠的情况,此时就出现了显示谁的情况.在多层布局时,容易出现这种情况 定位position见:http://blog.csdn.net/baidu_37107022/art ...

  3. Android Apk的反编译和加密

    这几天在上海出差,忙里偷闲学习了一下Apk的反编译工具的基本使用.下面就简单介绍一下如何将我们从网上下载的Apk文件进行反编译得到我们想要获得的资源文件和源码. Android的应用程序APK文件说到 ...

  4. Dojo初探之5:dojo的request(请求)操作、请求过程事件绑定和隐藏数据data()操作(基于dojo1.11.2版本)

    前言: 上一章详细阐述了dojo的事件绑定操作,本章将讲解dojo的请求操作 注:dojo的请求操作与js和jquery完全不同! 1.dojo的请求 dojo通过request.get()/.put ...

  5. re 学习随便

    . 任意一个字符 \转义字符 *  字符重复0--多次 + 字符重复1-多次 ? 字符重复0-1次 ^行首匹配 或者在一个字符集中表示取反 \$  匹配字符串末尾 \b 匹配\w 与\w 之间的 \B ...

  6. 解决其他浏览器没有propertychange事件

    监听实现: /** * Listener.js * 此类用于解决非ie下,通过js改变input的值时, * 无法触发其事件的问题(如:onpropertychange, oninput, oncha ...

  7. EJB基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-ejb/ 什么是EJB 可移植的, 可重用的, 可伸缩的业务应用程序的平台 为什么选择EJB ...

  8. phantomjs-prebuilt@2.1.14 install: `node install.js`

    在用vue-cli构建项目时,npm install 安装包的时候报错了. 错误信息: npm ERR! Failed at the phantomjs-prebuilt@2.1.14 install ...

  9. 带着问题写React Native原生控件--Android视频直播控件

    最近在做的采用React Native项目有一个需求,视频直播与直播流播放同一个布局中,带着问题去思考如何实现,能更容易找到问题关键点,下面分析这个控件解决方法: 现在条件:视频播放控件(开源的ijk ...

  10. BinarySearchTree-二叉搜索树

    一.二叉搜索树的定义及性质 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空 ...