怎样让Python脚本与C++程序互相调用

Python07

怎样让Python脚本与C++程序互相调用,第1张

二、Python调用C/C++\x0d\x0a\x0d\x0a\x0d\x0a1、Python调用C动态链接库\x0d\x0a\x0d\x0aPython调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。\x0d\x0a(1)C语言文件:pycall.c\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a/***gcc -o libpycall.so -shared -fPIC pycall.c*/ \x0d\x0a#include \x0d\x0a#include \x0d\x0aint foo(int a, int b) \x0d\x0a{ \x0d\x0a printf("you input %d and %d\n", a, b) \x0d\x0a return a+b \x0d\x0a} \x0d\x0a(2)gcc编译生成动态库libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern "C"来进行编译。\x0d\x0a(3)Python调用动态库的文件:pycall.py\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0aimport ctypes \x0d\x0all = ctypes.cdll.LoadLibrary \x0d\x0alib = ll("./libpycall.so")\x0d\x0alib.foo(1, 3) \x0d\x0aprint '***finish***' \x0d\x0a(4)运行结果:\x0d\x0a\x0d\x0a\x0d\x0a2、Python调用C++(类)动态链接库 \x0d\x0a\x0d\x0a 需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern "C",构建后的动态链接库没有这些函数的符号表。\x0d\x0a(1)C++类文件:pycallclass.cpp\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a#include \x0d\x0ausing namespace std \x0d\x0a \x0d\x0aclass TestLib \x0d\x0a{ \x0d\x0apublic: \x0d\x0avoid display() \x0d\x0avoid display(int a) \x0d\x0a} \x0d\x0avoid TestLib::display() { \x0d\x0acout \x0d\x0ausing namespace std \x0d\x0aint test() \x0d\x0a{ \x0d\x0aint a = 10, b = 5 \x0d\x0areturn a+b \x0d\x0a} \x0d\x0aint main() \x0d\x0a{ \x0d\x0acout \x0d\x0a#include \x0d\x0a#include \x0d\x0a \x0d\x0aint fac(int n) \x0d\x0a{ \x0d\x0aif (n 回答于 2022-11-16

C/C++对Python的调用层次可以分为三个层次, (1) 高层次的调用, (2)纯Python调用, (3) Python方法的扩展(也就使向Python输出调用函数). 这里我主要讨论(1)和(2)两种方法.

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调用