(超详细步骤)Visual Studio中如何利用C/C++调用Python程序(亲测有效)


很多网上教程不是缺少这个,就是缺少那个,即使不缺东西,配好之后,依旧调用不成功,这里写篇VS中如何调用Python程序的教程,亲测有效。


第一步:事先你要准备的东西

  1. 开发软件:Visual Studio
    我用的是2017版本。截至发布文章时,官网已发布VS2019版本
    下载最新版本Visual Studio
    下载旧版本Visual Studio
    Visual Studio 安装教程
    (PS:强烈建议大家把下面这两个都选上,之后可能会用到这个,教程中没有勾选“通用Windows平台开发”)
    在这里插入图片描述
  2. Python
    要下载安装包,同时,后续步骤中需要用到Python源代码,所以要一并下载。

第二步,生成python37_d.lib

  • 可以从这儿直接下载python37_d.lib,也可以按照以下步骤进行
  1. 解压下载好的Python源码,打开找到PCbuild->pcbuild.sln,用刚安装好的VS打开。
    打开后
    在这里插入图片描述
  2. 点击菜单栏 生成->配置管理器,如图所示:只勾选所有p开头的项目,配置:debug,平台:Win32。点击关闭
    在这里插入图片描述
  3. 之后,点击 项目 -> 属性 -> 属性配置 -> 常规,要选择一个Windows SDK版本
    在这里插入图片描述
  4. 然后菜单栏 生成->重新生成解决方案
    等待几分钟,生成之后,回到PCbuild文件夹中,就会看到多出来一个Win32文件夹,打开,即可找到Python37_d.lib
    在这里插入图片描述

第三步: VS中配置环境

  1. 新建一个C++工程(教程)

  2. 菜单栏 项目 -> 属性

  3. C/C++ -> 常规 -> 附加包含目录 -> 编辑
    在这里插入图片描述

  4. 添加python安装目录Python\include,我的Python直接安装在D盘根目录下,所以我添加的路径为D:\python3.7.1\include
    在这里插入图片描述

  5. 继续点击 链接器 -> 常规 -> 附加库目录 -> 编辑
    在这里插入图片描述

  6. 把安装的Python文件夹中的libs所在路径添加进去,我的是D:\python3.7.1\libs
    在这里插入图片描述

  7. 在本工程文件夹.cpp同目录下新建一个hello.py程序输入下列代码
    将下列代码添加进去

def add(a,b):  
    print ("These consequences are from Python code.")  
    print ("a = " + str(a))  
    print ("b = " + str(b))  
    print ("ret = " + str(a+b))  
    return a + b
  1. 在VS中复制如下代码
#include <Python.h>
#include<iostream>

using namespace std;

int main()
{
	
	Py_SetPythonHome(L"D:\python3.7.1\python"); 
	/**
	这句语句是在添加python.exe所在路径,不添加虽然编译没有问题,但是会在运行时出现
	Fatal Python error: initfsencoding: unable to load the file system codec
	ModuleNotFoundError: No module named 'encodings'
	这种很无厘头的错误
	**/
	Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
	if (!Py_IsInitialized())
	{
		printf("初始化失败!");
		return 0;
	}
	else {
		PyRun_SimpleString("import sys");
		PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径


		PyObject * pModule = NULL;//声明变量
		PyObject * pFunc = NULL;// 声明变量

		pModule = PyImport_ImportModule("hello");//这里是要调用的文件名hello.py
		if (pModule == NULL)
		{
			cout << "没找到该Python文件" << endl;
		}
		else {
			pFunc = PyObject_GetAttrString(pModule, "add");//这里是要调用的函数名
			PyObject* args = Py_BuildValue("(ii)", 28, 103);//给python函数参数赋值

			PyObject* pRet = PyObject_CallObject(pFunc, args);//调用函数

			int res = 0;
			PyArg_Parse(pRet, "i", &res);//转换返回类型

			cout << "res:" << res << endl;//输出结果
		}
		Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
	}
	return 0;
}
  1. 把第一步生成的python37_d.lib文件复制到python\libs中,如果不复制,则编译会出错,出现如下错误:
    在这里插入图片描述

  2. 之后,没有其他错误,点击 调试 -> 开始执行(不调试) 便会输出Python程序执行的结果:
    在这里插入图片描述


作者:小南瓜

日期:2019年4月19日17:35


评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值