1 高层次的调用
这是最简单的一种在C/C++中调用Python的方法. 它直接的调用Python提供的C调用接口函数, 这些函数主要有: PyRun_SimpleString(), PyRun_SimpleStringFlags(), PyRun_SimpleFile(), PyRun_SimpleFileEx()和PyRun_SimpleFileExFlags()几个. 函数的具体用法参考Python的文档.
这里举个例子来说明这种层次的用法:
由这个例子可见, 在C/C++中调用Python的内容非常简单, 只要构造一个简单的Python调用字符串.这里要注意的就是, Python调用串语句之间要用'/n'来分开, 且语句之间不能有空格, 如上面的Python字符串不能写成: "import sys/n print sys.path" , 否则要出错的.
// c/c++ 中 Python 调用必须的头文件
#include <Python.h>
//
int main(int argc, char* argv[])
{
// 初始化Python解析环境
Py_Initialize()
// 构造Python执行脚本
char szPyScript[128]
sprintf(szPyScript, "import sys/nprint sys.path")
if(PyRun_SimpleString(szPyScript) != 0)
{
sprintf(stderr, "execute /'%s/'failed!", szPyScript)
return -1
}
// 清除Python解析环境
Py_Finalize()
}
//
//
以上的例子也表明了在C/C++中调用Python的基本结构, 就是
(1) 先初始化Python环境然: Py_Initialize()
(2) 具体对Python的操作
(3) 清除Python环境
更复杂的一个使用高层调用的例子, 这个例子用PyRun_SimpleFile的例子.
这里值得注意是, 在Window中:
(1) 链接debug版本的时候会自动链接PythonXX(_d).lib库, PythonXX_d安装时是没有安装的, 所以要显示的指定链接PythonXX.lib库, 不知道VC6.0为什么还会去找PythonXX_d.lib, 在vs7.0不会.
(2) 编译时要以 /MD(多线程DLL) 选项编译(不论时debug版本还时release版本都一样).
以上我在VC7.0中可以正确的运行, 在VC6.0这样还不行, 可能和我使用的版本有关系(我用的版本是:Python24.lib). 有知道的请赐教!!
// c/c++ 中 Python 调用必须的头文件
#include <Python.h>
//
int main(int argc, char* argv[])
{
// 初始化Python解析环境
Py_Initialize()
//
char szFile[] = "PyFile.py"
//sprintf(szPathFile, "%s//%s", szPath, szFile)
FILE* fp = fopen(szFile, "r")
if(PyRun_SimpleFile(fp, szFile) != 0)
{
fclose(fp)
sprintf(stderr, "PyRun_SimpleFile(%s) failed!", saFile)
return -1
}
fclose(fp)
// 清除Python解析环境
Py_Finalize()
}
2 纯Python调用
最简单的情况,可以使用 getattr() :
import math
class Point:
def init (self, x, y):
self.x = x
self.y = y
p = Point(2, 3)
d = getattr(p, 'distance')(0, 0) # Calls p.distance(0, 0)
另外一种方法是使用 operator.methodcaller() ,例如:
import operator
operator.methodcaller('distance', 0, 0)(p)
当你需要通过相同的参数多次调用某个方法时,使用 operator.methodcaller 就很方便了。 比如你需要排序一系列的点,就可以这样做:
points = [
Point(1, 2),
Point(3, 0),
Point(10, -3),
Point(-5, -7),
Point(-1, 8),
Point(3, 2)
]
points.sort(key=operator.methodcaller('distance', 0, 0))
有两种方法:
一、
通过返回内部中定义的方法再在外部调用,像这样:
def a():
def b():
print('b')
return b
a()()
class c:
def f(self):
def g():
print ('g')
return g
c().f()()
这是运行截图:
二、
直接将内部方法定义成global的,像这样:
def a():
global b
def b():
print('bbb')
a()
b()
class c:
def f(self):
global g
def g():
print ('ggg')
c().f()
g()
这是运行截图: