版本
VS2022,Python3.10.3
Python安装
一定记得勾选 “
Download debug binaries
” ,表示是否下载用于VS的调试符号
Visual Studio配置
-
#include "D:\SoftWare\Python\include\Python.h"
或者 包含一下Python.h所在路径(项目、属性、C/C++、附加包含目录:填写附加头文件(*.h)所在目录 分号间隔多项)。 -
包含
python310_d.lib
(项目、属性、链接器、附加库目录:填写附加依赖库(*.lib)所在目录 分号间隔多项;
项目、属性、链接器(点前面的+展开)、输入、附加依赖项:填写附加依赖库的名字.lib 空格间隔多项)
编程实现
建一个python文件
py_add.py
def add(a=1,b=1):
print('Function of python called!')
print('a = ',a)
print('b = ',b)
print('a + b = ',a+b)
在同目录下建C文件或者C++文件
main.cpp
#include <iostream>
#include "D:\SoftWare\Python\include\Python.h"
int main()
{
std::cout << "Hello World!\n";
Py_Initialize();/* 开始Python解释器 */
if (!Py_IsInitialized())
{
printf("Python init failed!\n");
return -1;
}
//PyRun_SimpleString 为宏,执行一段python代码
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')"); //导入当前路径
PyObject* pName = NULL;
PyObject* pModule = NULL;
PyObject* pDict = NULL;
PyObject* pFunc = NULL;
PyObject* pArgs = NULL;
//加载名为py_add的python脚本
// pName = PyBytes_FromString("py_add");
/* pName = PyString_FromString("py_add");
pModule = PyImport_Import(pName);
//python>3.5,用下面函数导入
pModule = PyImport_Import(PyUnicode_FromString("py_add"));
if (!pModule)
{
printf("Load py_add.py failed!\n");
getchar();
return -1;
}
//获取模块字典属性
pDict = PyModule_GetDict(pModule);
if (!pDict)
{
printf("Can't find dict in py_add!\n");
return -1;
}
//通过字典获取模块中的类
pFunc = PyDict_GetItemString(pDict, "add");
if (!pFunc || !PyCallable_Check(pFunc))
{
printf("Can't find function!\n");
getchar();
return -1;
}
/*
向Python传参数是以元组(tuple)的方式传过去的,
因此我们实际上就是构造一个合适的Python元组就
可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
*/
pArgs = PyTuple_New(2);
// PyObject* Py_BuildValue(char *format, ...)
// 把C++的变量转换成一个Python对象。当需要从
// C++传递变量到Python时,就会使用这个函数。此函数
// 有点类似C的printf,但格式不同。常用的格式有
// s 表示字符串,
// i 表示整型变量, 如Py_BuildValue("ii",123,456)
// f 表示浮点数,
// O 表示一个Python对象
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 123));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 321));
//调用python的add函数
PyObject_CallObject(pFunc, pArgs);
//清理python对象
if (pName)
{
Py_DECREF(pName);
}
if (pArgs)
{
Py_DECREF(pArgs);
}
if (pModule)
{
Py_DECREF(pModule);
}
Py_Finalize(); /* 结束Python解释器,释放资源 */
}
C/C++与python互相调用: https://blog.csdn.net/u012234115/article/details/50210835
版权声明:本文为weixin_42979021原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。