如何在C++中调用Python脚本:提升编程效率与质量的关键技巧
目录

1。背景介绍和编程环境
背景简介:
近年来,由于其简单性和易于学习(与其他编程语言相比)及其功能强大的功能库(除其他优点外),因此许多编程爱好者都受到了许多编程爱好者的青睐。它也被广泛用于人工智能智能算法编程中。 C/C ++语言是一种基本的编程语言,可以与内核进行交互并提高编程质量。 C/C ++和Python都有自己的编程优势。 Python语言发展效率很高。通常,您需要使用Python来执行一些任务脚本。脚本主要包括任务过程所需的命令执行和返回序列,最终需要在C/C ++编写的程序代码中执行这些命令,因此有必要在C/C ++中拨打Python脚本。
最近,我遇到了一种需要使用C ++调用Python代码的情况。在互联网上搜索后,我发现中文信息相对较少。因此,我借此机会将其组织到文档中,以便于后续参考。
编程环境:
Linux操作系统
Python3.5
2。完整的示例演示
C调用Python脚本程序:
//c_call_python.cpp
#include
int main()
{
//设定参数值
int a = 0;
int b = 6;
//第一步:初始化python环境
Py_Initialize();
//PyRun_SimpleString()执行命令语句
//测试python3的打印语句
PyRun_SimpleString("print('Hello Python!')\n");
PyRun_SimpleString("import os,sys");//执行import语句,把当前路径加入路径中,为了找到math_test.py
PyRun_SimpleString("sys.path.append('./')");
PyRun_SimpleString("print(os.getcwd())");//测试打印当前路径
PyObject *pModule;
PyObject *pFunction;
PyObject *pArgs;
PyObject *pRetValue;
//第二步:调用math_test脚本
pModule = PyImport_ImportModule("math_test");
if (!pModule) {
printf("import python failed1!!\n");
return -1;
}
//第三步:查找对应math_test.py中的def mainfunc(a,b)函数
pFunction = PyObject_GetAttrString(pModule, "mainfunc");
if (!pFunction) {
printf("get python function failed!!!\n");
return -1;
}
//第四步:新建python中的tuple对象(构建参数)
pArgs = PyTuple_New(2);
//PyTuple_SetItem(pArgs, 0, Py_BuildValue(""));
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", a));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", b));
//第五步:调用函数
pRetValue=PyObject_CallObject(pFunction, pArgs);
//第六步:清空PyObject
Py_DECREF(pModule);
Py_DECREF(pFunction);
Py_DECREF(pArgs);
Py_DECREF(pRetValue);
if (!pModule) {
printf("import python failed!!\n");
return -1;
}
//第七步:很关键的一步,如果是多次导入PyImport_ImportModule模块
//只有最后一步才调用Py_Finalize(),此时python全局变量一直保存着
Py_Finalize();
//方便查看
while (1);
return 0;
}
可执行的Python脚本1:Math_util.py
#!/usr/bin/python
import sys,codecs
import time
import other as oth
def add_func(a,b):
return (a+b)
def sub_func(a,b):
return (a-b)
def mainfunc(a,b):
starttime=time.time()
oth.funx2(a)
print("success!")
result_1=add_func(a,b)
result_2=sub_func(a,b)
print("a+b= ",result_1," a-b= ",result_2)
endtime=time.time()
print("spend time: ",endtime-starttime)
def main():
mainfunc(2,6)
if __name__ == '__main__':
main()
可执行的Python脚本2:other.py
#other.py
import numpy as np
def funx2(a):
data = [[1,2],[3,4],[5,6]]
x = np.array(data)
print(x)
print("call funx2 numpy2")
return a*2
汇编命令如下:
gcc $(python3.5-config --ldflags) test3.c -o test3.out
上面提供的代码正常工作。正确操作的结果如下图所示:
其中,在调用Python脚本程序中,Python_Initialize()主要初始化Python解释器。
PY_SIMPLESTRING(“导入系统”)等同于Python中的导入SYS语句。
py_simplestring(“ sys.path.append('./')”)将搜索路径设置为当前目录。
py_importmodule(“ helloworld”)使用导入文件函数导入helloworld.py函数。
PyObject_getAttrstring(pmodule,“ Hello”)是在Pyton参考模块Helloworld.py中找到Hello函数。
然后致电pyeval_callobject(pfunc,null)调用Hello函数。最后一步是清理Python环境并发布资源。
3。问题收集
问题1:Python脚本本身有错误
上述问题的原因是Python脚本本身存在错误。解决方案是确保您的Python脚本可以运行。
问题2:python.h:没有这样的文件和目录
上述问题的原因是找不到python.h文件
目前,我调用的标头文件显示在上图中。一般而言,标题文件将存在。另一方面,系统中安装了多个Python版本,这使程序无法判断,因此需要指定特定版本,如图所示。当然,如果您只安装了一个版本的Python,则可能不会发生此问题。
问题3。编译命令导致错误问题
汇编命令有多种形式,例如
有时由于汇编而导致一些错误。由于特定的原因,作者无法明确解释(我希望您能启发我)。在互联网上搜索后,我尝试了各种编译说明,最后使用上面显示的汇编说明成功地进行了编译和运行。
问题4。致电第三方库时发生的问题
对于纯Python程序,大多数Python内置库可以正常称为。如果Python程序包含其他第三方库,则该电话可能会出错,并且很难找出原因。
4。摘要
学习在C/C ++程序中调用Python脚本可以充分利用两种编程语言的特征,从彼此的优势中学习,并提高编程效率和质量。通过将Python嵌入C/C ++中,您可以使用Python提供的强大功能。通过嵌入Python,您可以以动态链接库的形式替换接口。这样,您可以根据需要轻松修改脚本代码,而无需重新编译和链接二进制动态链接库。至少您可以将其视为文本形式的动态链接库,并且可以在必要时进行修改。只要接口不更改,一旦编译了C ++程序,修改它就不会那么方便。对于C语言的纯Python程序,Python随附的大多数库都可以正常称为。如果Python程序包含其他第三方库,则该电话可能会出错,并且很难找出原因。通常,一个大型Python项目(例如SSD目标检测)需要调用许多第三方库,并且多个模块相互交织。实际上,仍然会有一些麻烦的错误,因此,如果您只想使用Python项目,则可以通过文件连接生成的结果。本文简要介绍了在C/C ++程序中调用Python脚本的步骤。如果您有任何疑问,您可以发表评论供参考和讨论。如果有任何缺陷,请随时启发我。
5。参考链接