混合编程初探:C++调用Python函数

准备工作

新建一个控制台应用,写个简单的Hello World程序。

环境配置

C++调用Python脚本需要用到Python安装目录下的includelibs 以及相关的dll,因此需要把相应的路径添加到工程中。 如果libs文件夹下没有python36_d.lib文件,可复制python36.lib并重命名为python36_d.lib备用。

  1. 添加头文件目录以及库文件目录

    在解决方案资源管理器中选中当前项目,右键选择属性:

    属性

  2. 在项目属性页中的VC++目录选项里的包含目录、库目录中分别添加Pythonincludelibs的路径:目录

  3. 在链接器选项下的输入中添加附加依赖项python37_d.lib(位于Python安装目录下的libs文件夹中,直接填写文件名即可)。 在这里插入图片描述
    [注] Debug 版本的附加依赖项填写python37_d.libRelease 版本的附加依赖项填写python37.lib

代码测试

  1. 先写一个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()
    

    运行脚本得到如下结果
    Python脚本运行结果

  2. 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;
    }
    
  3. 调用结果
    C++调用Python脚本运行结果

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽墨志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值