1.怎么在Python和C++之间互相交互数据
python取得javascript里面的值
复制代码代码如下:
import PyV8
with PyV8.JSContext() as env1:
env1.eval("""
var_i = 1;
var_f = 1.0;
var_s = "test";
var_b = true;
""")
vars = env1.locals
var_i = vars.var_i
print var_i
javascript取得python里面的值
复制代码代码如下:
import PyV8
with PyV8.JSContext() as env1:
env1.securityToken = "foo"
env1.locals.prop = 3
print int(env1.eval("prop"))
python和javascript里面的函数交互
python调用javascript里面的函数python调用func就可以使用js里面的function函数了
复制代码代码如下:
import PyV8
with PyV8.JSContext() as ctxt:
func = ctxt.eval("""
(function ()
{
function a()
{
return "abc";
}
return a();
})
""")
print func()
这样也可以
复制代码代码如下:
import PyV8
with PyV8.JSContext() as ctxt:
func = ctxt.eval("""
function a()
{
return "abc";
}
function c()
{
return "abc";
}
""")
a = ctxt.locals.a
print a()
2.怎样让Python脚本与C++程序互相调用
二、Python调用C/C++1、Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。
(1)C语言文件:pycall.c[html] view plain copy /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include
(3)Python调用动态库的文件:pycall.py[html] view plain copy import ctypes ll = ctypes.cdll.LoadLibrary lib = ll("./libpycall.so") lib.foo(1, 3) print '***finish***' (4)运行结果:2、Python调用C++(类)动态链接库 需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern "C",构建后的动态链接库没有这些函数的符号表。
(1)C++类文件:pycallclass.cpp[html] view plain copy #include 可以用Python来写扩展,也可以用C和C++之类的编译型的语言来写扩展。Python在设计之初就考虑到要让模块的导入机制足够抽象。 抽象到让使用模块的代码无法了解到模块的具体实现细节。Python的可扩展性具有的优点:方便为语言增加新功能、具有可定制性、代码可以实现复用等。 为 Python 创建扩展需要三个主要的步骤:创建应用程序代码、利用样板来包装代码和编译与测试。(1)创建应用程序代码[html] view plain copy #include (2)用样板来包装代码 接口的代码被称为“样板”代码,它是应用程序代码与Python解释器之间进行交互所必不可少的一部分。样板主要分为4步:a、包含Python的头文件;b、为每个模块的每一个函数增加一个型如PyObject* Module_func()的包装函数;c、为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组;d、增加模块初始化函数void initModule()。 python取得javascript里面的值 复制代码代码如下: import PyV8 with PyV8.JSContext() as env1: env1.eval(""" var_i = 1; var_f = 1.0; var_s = "test"; var_b = true; """) vars = env1.locals var_i = vars.var_i print var_i javascript取得python里面的值 复制代码代码如下: import PyV8 with PyV8.JSContext() as env1: env1.securityToken = "foo" env1.locals.prop = 3 print int(env1.eval("prop")) python和javascript里面的函数交互 python调用javascript里面的函数python调用func就可以使用js里面的function函数了 复制代码代码如下: import PyV8 with PyV8.JSContext() as ctxt: func = ctxt.eval(""" (function () { function a() { return "abc"; } return a(); }) """) print func() 这样也可以 复制代码代码如下: import PyV8 with PyV8.JSContext() as ctxt: func = ctxt.eval(""" function a() { return "abc"; } function c() { return "abc"; } """) a = ctxt.locals.a print a() Python指它的标准实现,即CPython(虽然不是很严格)本文分4个部分C/C++ 调用 Python (基础篇)— 仅讨论Python官方提供的实现方式Python 调用 C/C++ (基础篇)— 仅讨论Python官方提供的实现方式C/C++ 调用 Python (高级篇)— 使用 CythonPython 调用 C/C++ (高级篇)— 使用 SWIG练习本文中的例子,需要搭建Python扩展开发环境。 具体细节见搭建Python扩展开发环境 - 蛇之魅惑 - 知乎专栏1 C/C++ 调用 Python(基础篇)Python 本身就是一个C库。你所看到的可执行体python只不过是个stub。 真正的python实体在动态链接库里实现,在Windows平台上,这个文件位于 %SystemRoot%\System32\python27.dll。你也可以在自己的程序中调用Python,看起来非常容易://my_python.c #include int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); Py_Initialize(); PyRun_SimpleString("print 'Hello Python!'\n"); Py_Finalize(); return 0; } 在Windows平台下,打开Visual Studio命令提示符,编译命令为cl my_python.c -IC:\Python27\include C:\Python27\libs\python27.lib 在Linux下编译命令为gcc my_python.c -o my_python -I/usr/include/python2.7/ -lpython2.7 在Mac OS X 下的编译命令同上产生可执行文件后,直接运行,结果为输出Hello Python! Python库函数PyRun_SimpleString可以执行字符串形式的Python代码。 虽然非常简单,但这段代码除了能用C语言动态生成一些Python代码之外,并没有什么用处。我们需要的是C语言的数据结构能够和Python交互。 下面举个例子,比如说,有一天我们用Python写了一个功能特别强大的函数:def great_function(a): return a + 1 接下来要把它包装成C语言的函数。我们期待的C语言的对应函数应该是这样的:int great_function_from_python(int a) { int res; // some magic return res; } 首先,复用Python模块得做'import',这里也不例外。 所以我们把great_function放到一个module里,比如说,这个module名字叫 great_module.py接下来就要用C来调用Python了,完整的代码如下:#include int great_function_from_python(int a) { int res; PyObject *pModule,*pFunc; PyObject *pArgs, *pValue; /* import */ pModule = PyImport_Import(PyString_FromString("great_module")); /* great_module.great_function */ pFunc = PyObject_GetAttrString(pModule, "great_function"); /* build args */ pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs,0, PyInt_FromLong(a)); /* call */ pValue = PyObject_CallObject(pFunc, pArgs); res = PyInt_AsLong(pValue); return res; } 从上述代码可以窥见Python内部运行的方式:所有Python元素,module、function、tuple、string等等,实际上都是PyObject。C语言里操纵它们,一律使用PyObject *。 Python的类型与C语言类型可以相互转换。Python类型XXX转换为C语言类型YYY要使用PyXXX_AsYYY函数;C类型YYY转换为Python类型XXX要使用PyXXX_FromYYY函数。 也可以创建Python类型的变量,使用PyXXX_New可以创建类型为XXX的变量。若a是Tuple,则a[i] = b对应于 PyTuple_SetItem(a,i,b),有理由相信还有一个函数PyTuple_GetItem完成取得某一项的值。 不仅Python语言很优雅,Python的库函数API也非常优雅。现在我们得到了一个C语言的函数了,可以写一个main测试它#include int great_function_from_python(int a); int main(int argc, char *argv[]) { Py_Initialize(); printf("%d",great_function_from_python(2)); Py_Finalize(); } 编译的方式就用本节开头使用的方法。 在Linux/Mac OSX运行此示例之前,可能先需要设置环境变量:bash:export PYTHONPATH=.:$PYTHONPATH csh:setenv PYTHONPATH .:$PYTHONPATH 2 Python 调用 C/C++(基础篇)这种做法称为Python扩展。比如说,我们有一个功能强大的C函数:int great_function(int a) { return a + 1; } 期望在Python里这样使用:>>> from great_module import great_function >>> great_function(2) 3 考虑最简单的情况。 我们把功能强大的函数放入C文件 great_module.c 中。#include int great_function(int a) { return a + 1; } static PyObject * _great_function(PyObject *self, PyObject *args) { int _a; int res; if (!PyArg_ParseTuple(args, "i", &_a)) return NULL; res = great_function(_a); return PyLong_FromLong(res); } static PyMethodDef GreateModuleMethods[] = { { "great_function", _great_function, METH_VARARGS, "" }, {NULL, NULL, 0, NULL} }; PyMODINIT_FUNC initgreat_module(void) { (void) Py_InitModule("great_module", GreateModuleMethods); } 除了功能强大的函数great_function外,这个文件中还有以下部分:包裹函数_great_function。 它负责将Python的参数转化为C的参数(PyArg_ParseTuple),调用实际的great_function,并处理great_function的返回值,最终返回给Python环境。导出表。 二、Python调用C/C++1、Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。 (1)C语言文件:pycall.c [html] view plain copy /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include (3)Python调用动态库的文件:pycall.py [html] view plain copy import ctypes ll = ctypes.cdll.LoadLibrary lib = ll("./libpycall.so") lib.foo(1, 3) print '***finish***' (4)运行结果:2、Python调用C++(类)动态链接库 需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern "C",构建后的动态链接库没有这些函数的符号表。 (1)C++类文件:pycallclass.cpp [html] view plain copy #include 可以用Python来写扩展,也可以用C和C++之类的编译型的语言来写扩展。Python在设计之初就考虑到要让模块的导入机制足够抽象。 抽象到让使用模块的代码无法了解到模块的具体实现细节。Python的可扩展性具有的优点:方便为语言增加新功能、具有可定制性、代码可以实现复用等。 为 Python 创建扩展需要三个主要的步骤:创建应用程序代码、利用样板来包装代码和编译与测试。(1)创建应用程序代码 [html] view plain copy #include (2)用样板来包装代码 接口的代码被称为“样板”代码,它是应用程序代码与Python解释器之间进行交互所必不可少的一部分。样板主要分为4步:a、包含Python的头文件;b、为每个模块的每一个函数增加一个型如PyObject* Module_func()的包装函数;c、为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组;d、增加模块初始化函数void initModule()。3.怎么在Python和C++之间互相交互数据
4.如何实现 C/C++ 与 Python 的通信
5.怎样让Python脚本与C++程序互相调用