• 【转】C++中嵌入python程序——参数传递


    C++中嵌入python程序——参数传递

    前面两篇博客已经介绍如何在C++中嵌套使用 python,但是在实际使用中,我们需要向python传递各种各样的参数,这样的程序才具有更高的灵活性。下面简单介绍一下参数传递,整体代码不再给出,只介绍几个核心语法,只要掌握就能与前面代码结合起来生成完整可用的代码。

    PyObject_CallMethod(pClass, “class_method”, “O”, pInstance) 
    参数分别为 PyObject(类),string(类方法),string(O表示参数为PyObject) ,PyObject(类实例)

    PyObject_CallFunction(pFun, “O”, pyores) 
    参数分别为 PyObject(函数),string(O表示参数为PyObject) ,PyObject(函数中使用的参数)

    问题来了,函数有多个参数怎么办,参数怎么传递?别担心,有多少个我们就写多少个: 
    PyObject_CallFunction(pFun, “OO…O”, PyObject 1,PyObject 2…PyObject n) 
    中间的O可替换成参数类型说明符中的任意一个,比如字符串s,int型变量i等等

    创建一个元组 
    PyObject *pArgs = PyTuple_New(3); 
    PyTuple_SetItem(pArgs, 0, Py_BuildValue(“i”, 1));//0—序号 i表示创建int型变量 
    PyTuple_SetItem(pArgs, 1, Py_BuildValue(“i”, 2)); 
    PyTuple_SetItem(pArgs, 2, Py_BuildValue(“i”, 3));

    PyEval_CallObject(pFunc, pArgs); //调用函数,pArgs元素个数与被调函数参数个数一致

    PyObject *pDict = PyDict_New(); //创建字典类型变量 
    PyDict_SetItemString(pDict, “Name”, Py_BuildValue(“s”, “Zhangsan”)); //往字典类型变量中填充数据 
    PyDict_SetItemString(pDict, “Address”, Py_BuildValue(“s”, “BeiJing”));

    将上述字典赋值给元组 
    PyObject *pArgs = PyTuple_New(1); 
    PyTuple_SetItem(pArgs, 0, pDict)

    python返回给C++的是PyObject类型,如果我想在纯C++程序里使用它怎么办:(可以使用下面这个函数 
    char * PyString_AsString(PyObject*)

    至此,利用上面的几个基本参数传递方法,已经可以创建灵活性较强的C++/python程序。


    传入参数类型说明符

    百度一下发现相关的内容一大堆,从这里http://www.cnblogs.com/lancelod/p/4036922.html摘抄了下来 
    s (string) [char *] 
    Convert a null-terminated C string to a Python object. If the C string pointer is NULL, None is used. 
    s# (string) [char *, int] 
    Convert a C string and its length to a Python object. If the C string pointer is NULL, the length is ignored and None is returned. 
    z (string or None) [char *] 
    Same as s. 
    z# (string or None) [char *, int] 
    Same as s#. 
    u (Unicode string) [Py_UNICODE *] 
    Convert a null-terminated buffer of Unicode (UCS-2 or UCS-4) data to a Python Unicode object. If the Unicode buffer pointer is NULL, Noneis returned. 
    u# (Unicode string) [Py_UNICODE *, int] 
    Convert a Unicode (UCS-2 or UCS-4) data buffer and its length to a Python Unicode object. If the Unicode buffer pointer is NULL, the length is ignored and None is returned. 
    i (integer) [int] 
    Convert a plain C int to a Python integer object. 
    b (integer) [char] 
    Convert a plain C char to a Python integer object. 
    h (integer) [short int] 
    Convert a plain C short int to a Python integer object. 
    l (integer) [long int] 
    Convert a C long int to a Python integer object. 
    B (integer) [unsigned char] 
    Convert a C unsigned char to a Python integer object. 
    H (integer) [unsigned short int] 
    Convert a C unsigned short int to a Python integer object. 
    I (integer/long) [unsigned int] 
    Convert a C unsigned int to a Python integer object or a Python long integer object, if it is larger than sys.maxint. 
    k (integer/long) [unsigned long] 
    Convert a C unsigned long to a Python integer object or a Python long integer object, if it is larger than sys.maxint. 
    L (long) [PY_LONG_LONG] 
    Convert a C long long to a Python long integer object. Only available on platforms that support long long. 
    K (long) [unsigned PY_LONG_LONG] 
    Convert a C unsigned long long to a Python long integer object. Only available on platforms that support unsigned long long. 
    n (int) [Py_ssize_t] 
    Convert a C Py_ssize_t to a Python integer or long integer.

    New in version 2.5.

    c (string of length 1) [char] 
    Convert a C int representing a character to a Python string of length 1. 
    d (float) [double] 
    Convert a C double to a Python floating point number. 
    f (float) [float] 
    Same as d. 
    D (complex) [Py_complex *] 
    Convert a C Py_complex structure to a Python complex number. 
    O (object) [PyObject *] 
    Pass a Python object untouched (except for its reference count, which is incremented by one). If the object passed in is a NULL pointer, it is assumed that this was caused because the call producing the argument found an error and set an exception. Therefore, Py_BuildValue()will return NULL but won’t raise an exception. If no exception has been raised yet, SystemError is set. 
    S (object) [PyObject *] 
    Same as O. 
    N (object) [PyObject *] 
    Same as O, except it doesn’t increment the reference count on the object. Useful when the object is created by a call to an object constructor in the argument list. 
    O& (object) [converter, anything] 
    Convert anything to a Python object through a converter function. The function is called with anything (which should be compatible withvoid *) as its argument and should return a “new” Python object, or NULL if an error occurred. 
    (items) (tuple) [matching-items] 
    Convert a sequence of C values to a Python tuple with the same number of items. 
    [items] (list) [matching-items] 
    Convert a sequence of C values to a Python list with the same number of items. 
    {items} (dictionary) [matching-items] 
    Convert a sequence of C values to a Python dictionary. Each pair of consecutive C values adds one item to the dictionary, serving as key and value, respectively.

    转自:http://blog.csdn.net/yiyouxian/article/details/51995029

  • 相关阅读:
    第35条:注解优先于命名模式
    Apache Shiro入门实例
    第34条:用接口模拟可伸缩的枚举
    Lua数组排序
    C++多态性的理解
    爱推软件
    VMProtect使用小计【一】
    android软件开发之webView.addJavascriptInterface循环渐进【二】
    cocos2dx如何添加popScene的场景动画
    Cocos2d-x 3.0 cocostudio骨骼动画的动态换肤
  • 原文地址:https://www.cnblogs.com/xuyuan77/p/8421891.html
Copyright © 2020-2023  润新知