准备工作
新建一个控制台应用,写个简单的Hello World程序。
环境配置
C++调用Python脚本需要用到Python安装目录下的include、libs 以及相关的dll,因此需要把相应的路径添加到工程中。 如果libs文件夹下没有python36_d.lib
文件,可复制python36.lib
并重命名为python36_d.lib
备用。
-
添加头文件目录以及库文件目录
在解决方案资源管理器中选中当前项目,右键选择属性:
-
在项目属性页中的VC++目录选项里的包含目录、库目录中分别添加Python的include和libs的路径:
-
在链接器选项下的输入中添加附加依赖项
python37_d.lib
(位于Python安装目录下的libs文件夹中,直接填写文件名即可)。
[注] Debug 版本的附加依赖项填写python37_d.lib
,Release 版本的附加依赖项填写python37.lib
。
代码测试
-
先写一个Python的测试脚本,用于打印当前日期和时间:
#!/usr/bin/python #coding:utf-8 import time def run(name): print("Hi,"+name+".") print("It is "+time.strftime("%Y-%m-%d %X", time.localtime())+".") def main(): run("Kevin") if __name__=='__main__': main()
运行脚本得到如下结果
-
C++调用
#include <iostream> #include <Python.h> using namespace std; int main(int argc, char *argv[]) { cout << "Python function called by Cpp!" << endl; // 初始化Python环境 Py_Initialize(); // 判断初始化是否成功 if (!Py_IsInitialized()) { cout << "Initialize failed ..." << endl; // 关闭 Python 脚本解释器,释放内存。 Py_Finalize(); return -1; } PyObject *pModule = NULL; PyObject *pFunc = NULL; PyObject *pArg = NULL; // 添加模块路径 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); // 导入模块 pModule = PyImport_ImportModule("DemoForCpp"); if (!pModule) // 检查模块是否导入成功 { cout << "Python file import failed ..." << endl; Py_Finalize(); return -1; } else { // 导入函数 pFunc = PyObject_GetAttrString(pModule, "run"); //python 脚本里的函数名 if (!pFunc) // 检查函数是否导入成功 { cout << "Function import failed ..." << endl; Py_Finalize(); return -1; } //C++类型转换为python类型 PyObject *pParams = Py_BuildValue("(s)", "Michael"); char *result; pArg = PyEval_CallObject(pFunc, pParams); // 调用函数 //获取结果,python类型转换为C++类型。 PyArg_Parse(pArg, "s", &result); cout << result << endl; } Py_Finalize(); return 0; }
-
调用结果