奥门威尼斯网址:Python脚本的中间各函数之间的调用关系

经过储藏室大家可以很清楚的看出有关Python脚本的当中各函数之间的调用关系,
那么以下的稿子首如若介绍大家怎么查占星关函数的内变量景况,希望您在看完那篇文章会具有收获。

C/Python 之间的调用关系

由于python有成都百货上千成效庞大的开源库,c能够借用在那之中措施,达成越多的机能。

就此C调用python的方法尤其注重。

C/Python 之间的调用关系

由于python有那些成效壮大的开源库,c能够借用个中措施,完毕更加的多的效能。

进而C调用python的章程越发主要。

C/Python 之间的调用关系

由于python有过多功用庞大的开源库,c能够借用在这之中措施,实现越来越多的职能。

所以C调用python的法子越发注重。

C/Python 之间的调用关系

鉴于python有多数效用庞大的开源库,c能够借用个中措施,实现更加多的职能。

从而C调用python的章程尤其首要。

正如我们所, python内部货仓和函数的调用由PyEval_EvalFrameEx完成的,
一次PyEval_伊娃lFrameEx意味着二次函数调用,象上边的第19,13,10行分别对应于main,
segv_test, freeNode函数,
将gdb定位到对应行后,使用pylocals宏就可以查阅该函数内部变量的详细景况。

方法/步骤

  1. ubuntu 14.04 linux c

    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

    Python 2.7.6

  2. file 1 [python file]: math_test.py

def add\_func(a,b):

return a+b



def sub\_func(a,b):

return (a-b)



file 2 \[c source file\]: c\_call\_python.c



\#include

\#include

\#include

\#include "python2.7/Python.h"



int main(int argc, char\*\* argv)

{

int arg0 = 0,arg1 = 0;

if(argc == 3){

arg0 = atoi(argv\[1\]);

arg1 = atoi(argv\[2\]);

}else{

printf("please input 2 args!!\\n");

return -1;

}



Py\_Initialize();

if ( !Py\_IsInitialized())

return -1;

PyRun\_SimpleString("import sys");

PyRun\_SimpleString("sys.path.append('./')");

PyObject \*pModule;

PyObject \*pFunction;

PyObject \*pArgs;

PyObject \*pRetValue;



pModule = PyImport\_ImportModule("math\_test");

if(!pModule){

printf("import python failed!!\\n");

return -1;

}



pFunction = PyObject\_GetAttrString(pModule, "add\_func");

if(!pFunction){

printf("get python function failed!!!\\n");

return -1;

}





pArgs = PyTuple\_New(2);

PyTuple\_SetItem(pArgs, 0, Py\_BuildValue("i", arg0));

PyTuple\_SetItem(pArgs, 1, Py\_BuildValue("i", arg1));



pRetValue = PyObject\_CallObject(pFunction, pArgs);

printf("%d + %d = %ld\\n",arg0,arg1,PyInt\_AsLong(pRetValue));



Py\_DECREF(pModule);

Py\_DECREF(pFunction);

Py\_DECREF(pArgs);

Py\_DECREF(pRetValue);



Py\_Finalize();

return 0;

}
  1. 3

    [email protected]:~/code#
    gcc -o c_call_python c_call_python.c -lpython2.7

    [email protected]:~/code#
    ./c_call_python 12 15

    12 + 15 = 27

    Python 扩大中的Py_BuildValue()函数

    Py_BuildValue()函数的功力和PyArg_ParseTuple()的效果与利益反倒,它是将C类型的数据结构调换来Python对象,该函数的原型:
    PyObject *Py_BuildValue(char *format, …)
    该函数能够和PyArg_ParseTuple()函数一样分辨一密密麻麻的格式串,不过输入参数只可以是值,而不可能是指针。它回到二个Python对象。
    和PyArg_ParseTuple()差异的某个是PyArg_ParseTuple()函数它的率先个参数为元组,Py_BuildValue()则不自然会生成二个元组。它生成二个元组仅仅当格式串蕴涵四个或然多少个格式单元,假诺格式串为空,重返NONE。
    在上面包车型地铁陈述中,括号中的项是格式单元再次回到的Python对象类型,方括号中的项为传递的C的值的品类。
    “s” (string) [char *]
    :将C字符串转变来Python对象,借使C字符串为空,重临NONE。 “s#”
    (string) [char *, int]
    :将C字符串和它的长短转变成Python对象,如果C字符串为空指针,长度忽略,重返NONE。
    “z” (string orNone) [char *] :作用同”s”。 “z#” (string orNone)
    [char *, int] :作用同”s#”。
    “i” (integer) [int]
    :将一个C类型的int转换成Python int对象。 “b” (integer) [char]
    :作用同”i”。
    “h” (integer) [short int] :作用同”i”。 **“l”
    (integer) [long int] :将C类型的long转换成Pyhon中的int对象。
    “c” (string of length 1) [char]
    :将C类型的char转换来长度为1的Python字符串对象。
    “d” (float)
    [double] :将C类型的double调换来python中的浮点型对象。 **”f”
    (float) [float] :
    作用同”d”。 “O&” (object)
    [converter,anything]
    :将别的数据类型通过转移函数转变到Python对象,那个多少作为调换函数的参数被调用并且再次回到八个新的Python对象,借使发生错误重返NULL。
    “(items)” (tuple) [matching-items]
    :将一密密麻麻的C值转变来Python元组。 “[items]” (list)
    [matching-items] :将一多种的C值转变到Python列表。
    “{items}”
    (dictionary) [matching-items]
    :将一系类的C值调换到Python的字典,每一对连日的C值将调换到一个键值对。 例如: Py_BuildValue(“”) None Py_BuildValue(“i”, 123) 123
    Py_BuildValue(“iii”, 123, 456, 789) (123, 456, 789)
    Py_BuildValue(“s”, “hello”) ‘hello’ Py_BuildValue(“ss”, “hello”,
    “world”) (‘hello’, ‘world’) Py_BuildValue(“s#”, “hello”, 4)
    ‘hell’
    Py_BuildValue(“()”) () **Py_BuildValue(“(i)”, 123) (123,)
    Py_BuildValue(“(ii)”, 123, 456) (123, 456) Py_BuildValue(“(i,i)”,
    123, 456) (123, 456) Py_BuildValue(“[i,i]”, 123, 456) [123,
    456] Py_BuildValue(“{s:i,s:i}”,”abc”, 123, “def”, 456) {‘abc’:
    123, ‘def’: 456} Py_BuildValue(“((ii)(ii)) (ii)”,1, 2, 3, 4, 5, 6)
    (((1, 2), (3, 4)), (5, 6))


    深切浅析 C++ 调用 Python 模块

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。接下来通过本文给大家介绍 C++ 调用 Python
模块的相关知识,需要的朋友参考下吧

一般开发过游戏的都知道Lua和C++可以很好的结合在一起,取长补短,把Lua脚本当成类似动态链接库来使用,很好的利用了脚本开发的灵活性。而作为一门流行的通用型脚本语言Python,也是可以做到的。在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。灵活性大大的提高了。

作为一种胶水语言,Python 能够很容易地调用 C 、 C++
等语言,也能够通过其他语言调用 Python 的模块。

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。

具体的文档参考官方指南:

Embedding Python in Another Application

调用方法

1 链接到 Python 调用库

Python 安装目录下已经包含头文件( include 目录)和库文件 ( Windows
下为 python27.lib)。

使用之前需要链接到此库。

2 直接调用 Python 语句

    #include "python/Python.h"int main(){Py_Initialize(); ## 初始化PyRun_SimpleString("print 'hello'");Py_Finalize(); ## 释放资源}

3 加载 Python 模块并调用函数

~/test 目录下含有 test.py :

    def test_add(a, b):print 'add ', a, ' and ', breturn a+b

则可以通过以下代码调用 test\_add 函数 :

    #include "python/Python.h"#include using namespace std;int main(){Py_Initialize(); // 初始化// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性string path = "~/test";string chdir_cmd = string("sys.path.append(\"") + path + "\")";const char* cstr_cmd = chdir_cmd.c_str();PyRun_SimpleString("import sys");PyRun_SimpleString(cstr_cmd);// 加载模块PyObject* moduleName = PyString_FromString("test"); //模块名,不是文件名PyObject* pModule = PyImport_Import(moduleName);if (!pModule) // 加载模块失败{cout << "[ERROR] Python get module failed." << endl;return 0;}cout << "[INFO] Python get module succeed." << endl;// 加载函数PyObject* pv = PyObject_GetAttrString(pModule, "test_add");if (!pv || !PyCallable_Check(pv)) // 验证是否加载成功{cout << "[ERROR] Can't find funftion (test_add)" << endl;return 0;}cout << "[INFO] Get function (test_add) succeed." << endl;// 设置参数PyObject* args = PyTuple_New(2); // 2个参数PyObject* arg1 = PyInt_FromLong(4); // 参数一设为4PyObject* arg2 = PyInt_FromLong(3); // 参数二设为3PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);// 调用函数PyObject* pRet = PyObject_CallObject(pv, args);// 获取参数if (pRet) // 验证是否调用成功{long result = PyInt_AsLong(pRet);cout << "result:" << result;}Py_Finalize(); ## 释放资源return 0;}

参数传递

1 C++ 向 Python 传递参数

Python 的参数实际上是元组,因此传参实际上就是构造一个合适的元组。

常用的有两种方法:

使用 PyTuple\_New 创建元组, PyTuple\_SetItem 设置元组值

    PyObject* args = PyTuple_New(3);PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);PyTuple_SetItem(args, 2, arg3);

直接使用Py\_BuildValue构造元组

    PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");PyObject* args = Py_BuildValue("()"); // 无参函数

i, s, f之类的格式字符串可以参考 格式字符串

2 转换 Python 返回值

调用 Python 得到的都是PyObject对象,因此需要使用 Python
提供的库里面的一些函数将返回值转换为 C++ , 例如
PyInt\_AsLong,PyFloat\_AsDouble, PyString\_AsString 等。

还可以使用 PyArg\_ParseTuple 函数来将返回值作为元组解析。

PyArg\_Parse 也是一个使用很方便的转换函数。

PyArg\_ParseTuple 和 PyArg\_Parse 都使用 格式字符串

注意事项

需要将 Python 的工作目录切换到模块所在路径
按照模块名加载而不是文件名
模块加载或者函数加载需要验证是否成功,否则可能会引起堆栈错误导致程序崩溃
需要使用 Py\_DECREF(PyObject\*) 来解除对象的引用(以便Python垃圾回收)

之间的调用关系
由于python有众多成效庞大的开源库,c能够借用当中措施,完毕更加的多的成效。
由此C调用python的不二法门尤其首要。 方法…

方法/步骤

  1. ubuntu 14.04 linux c

    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

    Python 2.7.6

  2. file 1 [python file]: math_test.py

def add\_func(a,b):

return a+b



def sub\_func(a,b):

return (a-b)



file 2 \[c source file\]: c\_call\_python.c



\#include

\#include

\#include

\#include "python2.7/Python.h"



int main(int argc, char\*\* argv)

{

int arg0 = 0,arg1 = 0;

if(argc == 3){

arg0 = atoi(argv\[1\]);

arg1 = atoi(argv\[2\]);

}else{

printf("please input 2 args!!\\n");

return -1;

}



Py\_Initialize();

if ( !Py\_IsInitialized())

return -1;

PyRun\_SimpleString("import sys");

PyRun\_SimpleString("sys.path.append('./')");

PyObject \*pModule;

PyObject \*pFunction;

PyObject \*pArgs;

PyObject \*pRetValue;



pModule = PyImport\_ImportModule("math\_test");

if(!pModule){

printf("import python failed!!\\n");

return -1;

}



pFunction = PyObject\_GetAttrString(pModule, "add\_func");

if(!pFunction){

printf("get python function failed!!!\\n");

return -1;

}





pArgs = PyTuple\_New(2);

PyTuple\_SetItem(pArgs, 0, Py\_BuildValue("i", arg0));

PyTuple\_SetItem(pArgs, 1, Py\_BuildValue("i", arg1));



pRetValue = PyObject\_CallObject(pFunction, pArgs);

printf("%d + %d = %ld\\n",arg0,arg1,PyInt\_AsLong(pRetValue));



Py\_DECREF(pModule);

Py\_DECREF(pFunction);

Py\_DECREF(pArgs);

Py\_DECREF(pRetValue);



Py\_Finalize();

return 0;

}
  1. 3

    [email protected]:~/code#
    gcc -o c_call_python c_call_python.c -lpython2.7

    [email protected]:~/code#
    ./c_call_python 12 15

    12 + 15 = 27

    Python 扩张中的Py_BuildValue()函数

    Py_BuildValue()函数的机能和PyArg_ParseTuple()的职能反倒,它是将C类型的数据结构转变到Python对象,该函数的原型:
    PyObject *Py_BuildValue(char *format, …)
    该函数能够和PyArg_ParseTuple()函数一样分辨一多级的格式串,不过输入参数只好是值,而不可能是指针。它回到二个Python对象。
    和PyArg_ParseTuple()不一致的一些是PyArg_ParseTuple()函数它的第三个参数为元组,Py_BuildValue()则不确定会扭转一个元组。它生成叁个元组仅仅当格式串富含七个大概八个格式单元,假如格式串为空,再次回到NONE。
    在下边包车型地铁叙述中,括号中的项是格式单元重回的Python对象类型,方括号中的项为传递的C的值的类型。
    “s” (string) [char *]
    :将C字符串转变来Python对象,假设C字符串为空,重临NONE。 “s#”
    (string) [char *, int]
    :将C字符串和它的长度调换来Python对象,如若C字符串为空指针,长度忽略,再次回到NONE。
    “z” (string orNone) [char *] :作用同”s”。 “z#” (string orNone)
    [char *, int] :作用同”s#”。
    “i” (integer) [int]
    :将一个C类型的int转换成Python int对象。 “b” (integer) [char]
    :作用同”i”。
    “h” (integer) [short int] :作用同”i”。 **“l”
    (integer) [long int] :将C类型的long转换成Pyhon中的int对象。
    “c” (string of length 1) [char]
    :将C类型的char调换成长度为1的Python字符串对象。
    “d” (float)
    [double] :将C类型的double转变到python中的浮点型对象。 **”f”
    (float) [float] :
    作用同”d”。 “O&” (object)
    [converter,anything]
    :将其余数据类型通过更动函数转变来Python对象,那么些多少作为转变函数的参数被调用而且重临二个新的Python对象,假使爆发错误再次回到NULL。
    “(items)” (tuple) [matching-items]
    :将一文山会海的C值调换到Python元组。 “[items]” (list)
    [matching-items] :将一雨后春笋的C值转变来Python列表。
    “{items}”
    (dictionary) [matching-items]
    :将一系类的C值转变到Python的字典,每一对连日的C值将转变来叁个键值对。 例如: Py_BuildValue(“”) None Py_BuildValue(“i”, 123) 123
    Py_BuildValue(“iii”, 123, 456, 789) (123, 456, 789)
    Py_BuildValue(“s”, “hello”) ‘hello’ Py_BuildValue(“ss”, “hello”,
    “world”) (‘hello’, ‘world’) Py_BuildValue(“s#”, “hello”, 4)
    ‘hell’
    Py_BuildValue(“()”) () **Py_BuildValue(“(i)”, 123) (123,)
    Py_BuildValue(“(ii)”, 123, 456) (123, 456) Py_BuildValue(“(i,i)”,
    123, 456) (123, 456) Py_BuildValue(“[i,i]”, 123, 456) [123,
    456] Py_BuildValue(“{s:i,s:i}”,”abc”, 123, “def”, 456) {‘abc’:
    123, ‘def’: 456} Py_BuildValue(“((ii)(ii)) (ii)”,1, 2, 3, 4, 5, 6)
    (((1, 2), (3, 4)), (5, 6))


    深远浅析 C++ 调用 Python 模块

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。接下来通过本文给大家介绍 C++ 调用 Python
模块的相关知识,需要的朋友参考下吧

一般开发过游戏的都知道Lua和C++可以很好的结合在一起,取长补短,把Lua脚本当成类似动态链接库来使用,很好的利用了脚本开发的灵活性。而作为一门流行的通用型脚本语言Python,也是可以做到的。在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。灵活性大大的提高了。

作为一种胶水语言,Python 能够很容易地调用 C 、 C++
等语言,也能够通过其他语言调用 Python 的模块。

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。

具体的文档参考官方指南:

Embedding Python in Another Application

调用方法

1 链接到 Python 调用库

Python 安装目录下已经包含头文件( include 目录)和库文件 ( Windows
下为 python27.lib)。

使用之前需要链接到此库。

2 直接调用 Python 语句

    #include "python/Python.h"int main(){Py_Initialize(); ## 初始化PyRun_SimpleString("print 'hello'");Py_Finalize(); ## 释放资源}

3 加载 Python 模块并调用函数

~/test 目录下含有 test.py :

    def test_add(a, b):print 'add ', a, ' and ', breturn a+b

则可以通过以下代码调用 test\_add 函数 :

    #include "python/Python.h"#include using namespace std;int main(){Py_Initialize(); // 初始化// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性string path = "~/test";string chdir_cmd = string("sys.path.append(\"") + path + "\")";const char* cstr_cmd = chdir_cmd.c_str();PyRun_SimpleString("import sys");PyRun_SimpleString(cstr_cmd);// 加载模块PyObject* moduleName = PyString_FromString("test"); //模块名,不是文件名PyObject* pModule = PyImport_Import(moduleName);if (!pModule) // 加载模块失败{cout << "[ERROR] Python get module failed." << endl;return 0;}cout << "[INFO] Python get module succeed." << endl;// 加载函数PyObject* pv = PyObject_GetAttrString(pModule, "test_add");if (!pv || !PyCallable_Check(pv)) // 验证是否加载成功{cout << "[ERROR] Can't find funftion (test_add)" << endl;return 0;}cout << "[INFO] Get function (test_add) succeed." << endl;// 设置参数PyObject* args = PyTuple_New(2); // 2个参数PyObject* arg1 = PyInt_FromLong(4); // 参数一设为4PyObject* arg2 = PyInt_FromLong(3); // 参数二设为3PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);// 调用函数PyObject* pRet = PyObject_CallObject(pv, args);// 获取参数if (pRet) // 验证是否调用成功{long result = PyInt_AsLong(pRet);cout << "result:" << result;}Py_Finalize(); ## 释放资源return 0;}

参数传递

1 C++ 向 Python 传递参数

Python 的参数实际上是元组,因此传参实际上就是构造一个合适的元组。

常用的有两种方法:

使用 PyTuple\_New 创建元组, PyTuple\_SetItem 设置元组值

    PyObject* args = PyTuple_New(3);PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);PyTuple_SetItem(args, 2, arg3);

直接使用Py\_BuildValue构造元组

    PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");PyObject* args = Py_BuildValue("()"); // 无参函数

i, s, f之类的格式字符串可以参考 格式字符串

2 转换 Python 返回值

调用 Python 得到的都是PyObject对象,因此需要使用 Python
提供的库里面的一些函数将返回值转换为 C++ , 例如
PyInt\_AsLong,PyFloat\_AsDouble, PyString\_AsString 等。

还可以使用 PyArg\_ParseTuple 函数来将返回值作为元组解析。

PyArg\_Parse 也是一个使用很方便的转换函数。

PyArg\_ParseTuple 和 PyArg\_Parse 都使用 格式字符串

注意事项

需要将 Python 的工作目录切换到模块所在路径
按照模块名加载而不是文件名
模块加载或者函数加载需要验证是否成功,否则可能会引起堆栈错误导致程序崩溃
需要使用 Py\_DECREF(PyObject\*) 来解除对象的引用(以便Python垃圾回收)

之间的调用关系
由于python有相当多功效庞大的开源库,c能够借用个中措施,实现越多的意义。
因而C调用python的办法尤其重视。 方法…

方法/步骤

  1. ubuntu 14.04 linux c

    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

    Python 2.7.6

  2. file 1 [python file]: math_test.py

def add\_func(a,b):

return a+b



def sub\_func(a,b):

return (a-b)



file 2 \[c source file\]: c\_call\_python.c



\#include

\#include

\#include

\#include "python2.7/Python.h"



int main(int argc, char\*\* argv)

{

int arg0 = 0,arg1 = 0;

if(argc == 3){

arg0 = atoi(argv\[1\]);

arg1 = atoi(argv\[2\]);

}else{

printf("please input 2 args!!\\n");

return -1;

}



Py\_Initialize();

if ( !Py\_IsInitialized())

return -1;

PyRun\_SimpleString("import sys");

PyRun\_SimpleString("sys.path.append('./')");

PyObject \*pModule;

PyObject \*pFunction;

PyObject \*pArgs;

PyObject \*pRetValue;



pModule = PyImport\_ImportModule("math\_test");

if(!pModule){

printf("import python failed!!\\n");

return -1;

}



pFunction = PyObject\_GetAttrString(pModule, "add\_func");

if(!pFunction){

printf("get python function failed!!!\\n");

return -1;

}





pArgs = PyTuple\_New(2);

PyTuple\_SetItem(pArgs, 0, Py\_BuildValue("i", arg0));

PyTuple\_SetItem(pArgs, 1, Py\_BuildValue("i", arg1));



pRetValue = PyObject\_CallObject(pFunction, pArgs);

printf("%d + %d = %ld\\n",arg0,arg1,PyInt\_AsLong(pRetValue));



Py\_DECREF(pModule);

Py\_DECREF(pFunction);

Py\_DECREF(pArgs);

Py\_DECREF(pRetValue);



Py\_Finalize();

return 0;

}
  1. 3

    [email protected]:~/code#
    gcc -o c_call_python c_call_python.c -lpython2.7

    [email protected]:~/code#
    ./c_call_python 12 15

    12 + 15 = 27

    Python 扩充中的Py_BuildValue()函数

    Py_BuildValue()函数的功力和PyArg_ParseTuple()的效果与利益反倒,它是将C类型的数据结构调换来Python对象,该函数的原型:
    PyObject *Py_BuildValue(char *format, …)
    该函数能够和PyArg_ParseTuple()函数同样分辨一名目好多的格式串,可是输入参数只可以是值,而不能够是指针。它回到三个Python对象。
    和PyArg_ParseTuple()分裂的某个是PyArg_ParseTuple()函数它的首先个参数为元组,Py_BuildValue()则不自然会变动一个元组。它生成八个元组仅仅当格式串包蕴七个只怕八个格式单元,借使格式串为空,重临NONE。
    在上面包车型客车描述中,括号中的项是格式单元再次回到的Python对象类型,方括号中的项为传递的C的值的门类。
    “s” (string) [char *]
    :将C字符串转变到Python对象,假使C字符串为空,再次来到NONE。 “s#”
    (string) [char *, int]
    :将C字符串和它的长短转变到Python对象,即便C字符串为空指针,长度忽略,重临NONE。
    “z” (string orNone) [char *] :作用同”s”。 “z#” (string orNone)
    [char *, int] :作用同”s#”。
    “i” (integer) [int]
    :将一个C类型的int转换成Python int对象。 “b” (integer) [char]
    :作用同”i”。
    “h” (integer) [short int] :作用同”i”。 **“l”
    (integer) [long int] :将C类型的long转换成Pyhon中的int对象。
    “c” (string of length 1) [char]
    :将C类型的char调换来长度为1的Python字符串对象。
    “d” (float)
    [double] :将C类型的double转变来python中的浮点型对象。 **”f”
    (float) [float] :
    作用同”d”。 “O&” (object)
    [converter,anything]
    :将其余数据类型通过转移函数转换到Python对象,那么些数量作为调换函数的参数被调用况且重临贰个新的Python对象,假设产生错误重临NULL。
    “(items)” (tuple) [matching-items]
    :将一文山会海的C值转换到Python元组。 “[items]” (list)
    [matching-items] :将一多元的C值转变到Python列表。
    “{items}”
    (dictionary) [matching-items]
    :将一系类的C值转变来Python的字典,每一对连续的C值将转变到贰个键值对。 例如: Py_BuildValue(“”) None Py_BuildValue(“i”, 123) 123
    Py_BuildValue(“iii”, 123, 456, 789) (123, 456, 789)
    Py_BuildValue(“s”, “hello”) ‘hello’ Py_BuildValue(“ss”, “hello”,
    “world”) (‘hello’, ‘world’) Py_BuildValue(“s#”, “hello”, 4)
    ‘hell’
    Py_BuildValue(“()”) () **Py_BuildValue(“(i)”, 123) (123,)
    Py_BuildValue(“(ii)”, 123, 456) (123, 456) Py_BuildValue(“(i,i)”,
    123, 456) (123, 456) Py_BuildValue(“[i,i]”, 123, 456) [123,
    456] Py_BuildValue(“{s:i,s:i}”,”abc”, 123, “def”, 456) {‘abc’:
    123, ‘def’: 456} Py_BuildValue(“((ii)(ii)) (ii)”,1, 2, 3, 4, 5, 6)
    (((1, 2), (3, 4)), (5, 6))


    深刻浅析 C++ 调用 Python 模块

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。接下来通过本文给大家介绍 C++ 调用 Python
模块的相关知识,需要的朋友参考下吧

一般开发过游戏的都知道Lua和C++可以很好的结合在一起,取长补短,把Lua脚本当成类似动态链接库来使用,很好的利用了脚本开发的灵活性。而作为一门流行的通用型脚本语言Python,也是可以做到的。在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。灵活性大大的提高了。

作为一种胶水语言,Python 能够很容易地调用 C 、 C++
等语言,也能够通过其他语言调用 Python 的模块。

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。

具体的文档参考官方指南:

Embedding Python in Another Application

调用方法

1 链接到 Python 调用库

Python 安装目录下已经包含头文件( include 目录)和库文件 ( Windows
下为 python27.lib)。

使用之前需要链接到此库。

2 直接调用 Python 语句

    #include "python/Python.h"int main(){Py_Initialize(); ## 初始化PyRun_SimpleString("print 'hello'");Py_Finalize(); ## 释放资源}

3 加载 Python 模块并调用函数

~/test 目录下含有 test.py :

    def test_add(a, b):print 'add ', a, ' and ', breturn a+b

则可以通过以下代码调用 test\_add 函数 :

    #include "python/Python.h"#include using namespace std;int main(){Py_Initialize(); // 初始化// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性string path = "~/test";string chdir_cmd = string("sys.path.append(\"") + path + "\")";const char* cstr_cmd = chdir_cmd.c_str();PyRun_SimpleString("import sys");PyRun_SimpleString(cstr_cmd);// 加载模块PyObject* moduleName = PyString_FromString("test"); //模块名,不是文件名PyObject* pModule = PyImport_Import(moduleName);if (!pModule) // 加载模块失败{cout << "[ERROR] Python get module failed." << endl;return 0;}cout << "[INFO] Python get module succeed." << endl;// 加载函数PyObject* pv = PyObject_GetAttrString(pModule, "test_add");if (!pv || !PyCallable_Check(pv)) // 验证是否加载成功{cout << "[ERROR] Can't find funftion (test_add)" << endl;return 0;}cout << "[INFO] Get function (test_add) succeed." << endl;// 设置参数PyObject* args = PyTuple_New(2); // 2个参数PyObject* arg1 = PyInt_FromLong(4); // 参数一设为4PyObject* arg2 = PyInt_FromLong(3); // 参数二设为3PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);// 调用函数PyObject* pRet = PyObject_CallObject(pv, args);// 获取参数if (pRet) // 验证是否调用成功{long result = PyInt_AsLong(pRet);cout << "result:" << result;}Py_Finalize(); ## 释放资源return 0;}

参数传递

1 C++ 向 Python 传递参数

Python 的参数实际上是元组,因此传参实际上就是构造一个合适的元组。

常用的有两种方法:

使用 PyTuple\_New 创建元组, PyTuple\_SetItem 设置元组值

    PyObject* args = PyTuple_New(3);PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);PyTuple_SetItem(args, 2, arg3);

直接使用Py\_BuildValue构造元组

    PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");PyObject* args = Py_BuildValue("()"); // 无参函数

i, s, f之类的格式字符串可以参考 格式字符串

2 转换 Python 返回值

调用 Python 得到的都是PyObject对象,因此需要使用 Python
提供的库里面的一些函数将返回值转换为 C++ , 例如
PyInt\_AsLong,PyFloat\_AsDouble, PyString\_AsString 等。

还可以使用 PyArg\_ParseTuple 函数来将返回值作为元组解析。

PyArg\_Parse 也是一个使用很方便的转换函数。

PyArg\_ParseTuple 和 PyArg\_Parse 都使用 格式字符串

注意事项

需要将 Python 的工作目录切换到模块所在路径
按照模块名加载而不是文件名
模块加载或者函数加载需要验证是否成功,否则可能会引起堆栈错误导致程序崩溃
需要使用 Py\_DECREF(PyObject\*) 来解除对象的引用(以便Python垃圾回收)

之间的调用关系
由于python有看不完成效壮大的开源库,c可以借用在那之中措施,完毕越多的效力。
由此C调用python的不二秘技尤其关键。 方法…

方法/步骤

  1. ubuntu 14.04 linux c

    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

    Python 2.7.6

  2. file 1 [python file]: math_test.py

def add\_func(a,b):

return a+b



def sub\_func(a,b):

return (a-b)



file 2 \[c source file\]: c\_call\_python.c



\#include

\#include

\#include

\#include "python2.7/Python.h"



int main(int argc, char\*\* argv)

{

int arg0 = 0,arg1 = 0;

if(argc == 3){

arg0 = atoi(argv\[1\]);

arg1 = atoi(argv\[2\]);

}else{

printf("please input 2 args!!\\n");

return -1;

}



Py\_Initialize();

if ( !Py\_IsInitialized())

return -1;

PyRun\_SimpleString("import sys");

PyRun\_SimpleString("sys.path.append('./')");

PyObject \*pModule;

PyObject \*pFunction;

PyObject \*pArgs;

PyObject \*pRetValue;



pModule = PyImport\_ImportModule("math\_test");

if(!pModule){

printf("import python failed!!\\n");

return -1;

}



pFunction = PyObject\_GetAttrString(pModule, "add\_func");

if(!pFunction){

printf("get python function failed!!!\\n");

return -1;

}





pArgs = PyTuple\_New(2);

PyTuple\_SetItem(pArgs, 0, Py\_BuildValue("i", arg0));

PyTuple\_SetItem(pArgs, 1, Py\_BuildValue("i", arg1));



pRetValue = PyObject\_CallObject(pFunction, pArgs);

printf("%d + %d = %ld\\n",arg0,arg1,PyInt\_AsLong(pRetValue));



Py\_DECREF(pModule);

Py\_DECREF(pFunction);

Py\_DECREF(pArgs);

Py\_DECREF(pRetValue);



Py\_Finalize();

return 0;

}
  1. 3

    [email protected]:~/code#
    gcc -o c_call_python c_call_python.c -lpython2.7

    [email protected]:~/code#
    ./c_call_python 12 15

    12 + 15 = 27

    Python 扩大中的Py_BuildValue()函数

    Py_BuildValue()函数的作用和PyArg_ParseTuple()的坚守反倒,它是将C类型的数据结构调换到Python对象,该函数的原型:
    PyObject *Py_BuildValue(char *format, …)
    该函数能够和PyArg_ParseTuple()函数一样分辨一名目多数的格式串,可是输入参数只好是值,而无法是指针。它回到三个Python对象。
    和PyArg_ParseTuple()分化的有个别是PyArg_ParseTuple()函数它的第一个参数为元组,Py_BuildValue()则不确定会扭转一个元组。它生成二个元组仅仅当格式串包含三个可能五个格式单元,如若格式串为空,再次回到NONE。
    在底下的呈报中,括号中的项是格式单元重回的Python对象类型,方括号中的项为传递的C的值的种类。
    “s” (string) [char *]
    :将C字符串调换到Python对象,纵然C字符串为空,重返NONE。 “s#”
    (string) [char *, int]
    :将C字符串和它的长度调换到Python对象,借使C字符串为空指针,长度忽略,再次来到NONE。
    “z” (string orNone) [char *] :作用同”s”。 “z#” (string orNone)
    [char *, int] :作用同”s#”。
    “i” (integer) [int]
    :将一个C类型的int转换成Python int对象。 “b” (integer) [char]
    :作用同”i”。
    “h” (integer) [short int] :作用同”i”。 **“l”
    (integer) [long int] :将C类型的long转换成Pyhon中的int对象。
    “c” (string of length 1) [char]
    :将C类型的char转变来长度为1的Python字符串对象。
    “d” (float)
    [double] :将C类型的double调换到python中的浮点型对象。 **”f”
    (float) [float] :
    作用同”d”。 “O&” (object)
    [converter,anything]
    :将别的数据类型通过更动函数转变来Python对象,这个多少作为调换函数的参数被调用何况重返三个新的Python对象,假诺发生错误重返NULL。
    “(items)” (tuple) [matching-items]
    :将一雨后玉兰片的C值调换到Python元组。 “[items]” (list)
    [matching-items] :将一多级的C值转变来Python列表。
    “{items}”
    (dictionary) [matching-items]
    :将一系类的C值调换到Python的字典,每一对接二连三的C值将转换到几个键值对。 例如: Py_BuildValue(“”) None Py_BuildValue(“i”, 123) 123
    Py_BuildValue(“iii”, 123, 456, 789) (123, 456, 789)
    Py_BuildValue(“s”, “hello”) ‘hello’ Py_BuildValue(“ss”, “hello”,
    “world”) (‘hello’, ‘world’) Py_BuildValue(“s#”, “hello”, 4)
    ‘hell’
    Py_BuildValue(“()”) () **Py_BuildValue(“(i)”, 123) (123,)
    Py_BuildValue(“(ii)”, 123, 456) (123, 456) Py_BuildValue(“(i,i)”,
    123, 456) (123, 456) Py_BuildValue(“[i,i]”, 123, 456) [123,
    456] Py_BuildValue(“{s:i,s:i}”,”abc”, 123, “def”, 456) {‘abc’:
    123, ‘def’: 456} Py_BuildValue(“((ii)(ii)) (ii)”,1, 2, 3, 4, 5, 6)
    (((1, 2), (3, 4)), (5, 6))


    长远浅析 C++ 调用 Python 模块

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。接下来通过本文给大家介绍 C++ 调用 Python
模块的相关知识,需要的朋友参考下吧

一般开发过游戏的都知道Lua和C++可以很好的结合在一起,取长补短,把Lua脚本当成类似动态链接库来使用,很好的利用了脚本开发的灵活性。而作为一门流行的通用型脚本语言Python,也是可以做到的。在一个C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件(堪称文本形式的动态链接库),这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。灵活性大大的提高了。

作为一种胶水语言,Python 能够很容易地调用 C 、 C++
等语言,也能够通过其他语言调用 Python 的模块。

Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python
模块。

具体的文档参考官方指南:

Embedding Python in Another Application

调用方法

1 链接到 Python 调用库

Python 安装目录下已经包含头文件( include 目录)和库文件 ( Windows
下为 python27.lib)。

使用之前需要链接到此库。

2 直接调用 Python 语句

    #include "python/Python.h"int main(){Py_Initialize(); ## 初始化PyRun_SimpleString("print 'hello'");Py_Finalize(); ## 释放资源}

3 加载 Python 模块并调用函数

~/test 目录下含有 test.py :

    def test_add(a, b):print 'add ', a, ' and ', breturn a+b

则可以通过以下代码调用 test\_add 函数 :

    #include "python/Python.h"#include using namespace std;int main(){Py_Initialize(); // 初始化// 将Python工作路径切换到待调用模块所在目录,一定要保证路径名的正确性string path = "~/test";string chdir_cmd = string("sys.path.append(\"") + path + "\")";const char* cstr_cmd = chdir_cmd.c_str();PyRun_SimpleString("import sys");PyRun_SimpleString(cstr_cmd);// 加载模块PyObject* moduleName = PyString_FromString("test"); //模块名,不是文件名PyObject* pModule = PyImport_Import(moduleName);if (!pModule) // 加载模块失败{cout << "[ERROR] Python get module failed." << endl;return 0;}cout << "[INFO] Python get module succeed." << endl;// 加载函数PyObject* pv = PyObject_GetAttrString(pModule, "test_add");if (!pv || !PyCallable_Check(pv)) // 验证是否加载成功{cout << "[ERROR] Can't find funftion (test_add)" << endl;return 0;}cout << "[INFO] Get function (test_add) succeed." << endl;// 设置参数PyObject* args = PyTuple_New(2); // 2个参数PyObject* arg1 = PyInt_FromLong(4); // 参数一设为4PyObject* arg2 = PyInt_FromLong(3); // 参数二设为3PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);// 调用函数PyObject* pRet = PyObject_CallObject(pv, args);// 获取参数if (pRet) // 验证是否调用成功{long result = PyInt_AsLong(pRet);cout << "result:" << result;}Py_Finalize(); ## 释放资源return 0;}

参数传递

1 C++ 向 Python 传递参数

Python 的参数实际上是元组,因此传参实际上就是构造一个合适的元组。

常用的有两种方法:

使用 PyTuple\_New 创建元组, PyTuple\_SetItem 设置元组值

    PyObject* args = PyTuple_New(3);PyObject* arg1 = Py_BuildValue("i", 100); // 整数参数PyObject* arg2 = Py_BuildValue("f", 3.14); // 浮点数参数PyObject* arg3 = Py_BuildValue("s", "hello"); // 字符串参数PyTuple_SetItem(args, 0, arg1);PyTuple_SetItem(args, 1, arg2);PyTuple_SetItem(args, 2, arg3);

直接使用Py\_BuildValue构造元组

    PyObject* args = Py_BuildValue("ifs", 100, 3.14, "hello");PyObject* args = Py_BuildValue("()"); // 无参函数

i, s, f之类的格式字符串可以参考 格式字符串

2 转换 Python 返回值

调用 Python 得到的都是PyObject对象,因此需要使用 Python
提供的库里面的一些函数将返回值转换为 C++ , 例如
PyInt\_AsLong,PyFloat\_AsDouble, PyString\_AsString 等。

还可以使用 PyArg\_ParseTuple 函数来将返回值作为元组解析。

PyArg\_Parse 也是一个使用很方便的转换函数。

PyArg\_ParseTuple 和 PyArg\_Parse 都使用 格式字符串

注意事项

需要将 Python 的工作目录切换到模块所在路径
按照模块名加载而不是文件名
模块加载或者函数加载需要验证是否成功,否则可能会引起堆栈错误导致程序崩溃
需要使用 Py\_DECREF(PyObject\*) 来解除对象的引用(以便Python垃圾回收)

之间的调用关系
由于python有为数相当的多功效庞大的开源库,c能够借用在那之中措施,完结越来越多的功能。
因而C调用python的办法尤其爱慕。 方法…

(gdb) up 13  #13 0x007d6d2b in PyEval_EvalFrameEx 
(f=0x81242fc, throwflag=0) at Python/ceval.c:2370  2370 in Python/ceval.c  (gdb) pylocals  s:  object : 
'<html><body><div><a><a></a></a><a></a></div></body></html>'  type : str  refcount: 3  address : 0xb7f64440  options:  object : 97  type : int  refcount: 7  address : 0x8082c20  doc:  object : <xmlDoc (None) object at 0xb7cc04ec> type : instance  refcount: 1  address : 0xb7cc04ec  ctxt:  object : <libxml2.xpathContext instance at 0xb7f70ccc> type : instance  refcount: 1  address : 0xb7f70ccc  nodes:  object : [<xmlNode ((儓X? object at 0xb7cc0cac>]  type : list  refcount: 2  address : 0xb7f70a8c  note:  object : <xmlNode ((?圶? object at 0xb7cc0cac> type : instance  refcount: 2  address : 0xb7cc0cac  nexts:  object : [<xmlNode (hhX? object at 0xb7cc750c>,
 <xmlNode (HXX? object at 0xb7cc76cc>, 
<xmlNode (@XX? object at 0xb7c9348c>]  type : list  refcount: 1  address : 0xb7f4ce4c  

Python脚本调节和测验时断点的设置是个很麻烦的事物,作者所能想到的有二种方式:

1 根据函数的python源码实行断点设置;

2 选取sleep函数和ctrl+c来行车制动器踏板程序的运作。

不论是怎么着使用各样推行进行调和都以非常的惨恻的事体,因为今年python解释器自身要做过多专门的学问。
由于自个儿对于python源码不是很纯熟,由此对怎么样行使gdb对python脚本调节和测量检验上也只是很简短的精晓,
这里权当投砾引珠,
迎接达人们给出共享的经验。以上便是对Python脚本内部各函数的调用关系,
以及如何查看函数内变量情状有关的从头到尾的经过的牵线,望你会具备收获。

那么以下的作品重借使介绍咱们怎么查占星关函数的内变量情…

发表评论

电子邮件地址不会被公开。 必填项已用*标注