很多网上教程不是缺少这个,就是缺少那个,即使不缺东西,配好之后,依旧调用不成功,这里写篇VS中如何调用Python程序的教程,亲测有效。
第一步:事先你要准备的东西
- 开发软件:Visual Studio。
我用的是2017版本。截至发布文章时,官网已发布VS2019版本
— 下载最新版本Visual Studio
— 下载旧版本Visual Studio
— Visual Studio 安装教程
(PS:强烈建议大家把下面这两个都选上,之后可能会用到这个,教程中没有勾选“通用Windows平台开发”)
- Python
要下载安装包,同时,后续步骤中需要用到Python源代码,所以要一并下载。
-
注意:下载的安装包和源码版本号必须一致
如果你要安装其他版本的Python,请将下列网址中版本号替换
https://www.python.org/downloads/release/python-371/ -
举个例子,我想下载Python3.7.3版本,就将上述网址中的371替换成373,其他Python版本号同上。 打开对应版本网页后,下拉至**Files**
-
第一个框起来的就是Python源码(下载文件后缀是.tar.xz),第二个框起来的是Windows64位安装包(下载文件后缀是.exe)
第二步,生成python37_d.lib
- 可以从这儿直接下载python37_d.lib,也可以按照以下步骤进行
- 解压下载好的Python源码,打开找到PCbuild->pcbuild.sln,用刚安装好的VS打开。
打开后
- 点击菜单栏 生成->配置管理器,如图所示:只勾选所有p开头的项目,配置:debug,平台:Win32。点击关闭。
- 之后,点击 项目 -> 属性 -> 属性配置 -> 常规,要选择一个Windows SDK版本
- 然后菜单栏 生成->重新生成解决方案
等待几分钟,生成之后,回到PCbuild文件夹中,就会看到多出来一个Win32文件夹,打开,即可找到Python37_d.lib
第三步: VS中配置环境
-
菜单栏 项目 -> 属性
-
C/C++ -> 常规 -> 附加包含目录 -> 编辑
-
添加python安装目录Python\include,我的Python直接安装在D盘根目录下,所以我添加的路径为D:\python3.7.1\include
-
继续点击 链接器 -> 常规 -> 附加库目录 -> 编辑
-
把安装的Python文件夹中的libs所在路径添加进去,我的是D:\python3.7.1\libs。
-
在本工程文件夹.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
- 在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;
}
-
把第一步生成的python37_d.lib文件复制到python\libs中,如果不复制,则编译会出错,出现如下错误:
-
之后,没有其他错误,点击 调试 -> 开始执行(不调试) 便会输出Python程序执行的结果:
作者:小南瓜
日期:2019年4月19日17:35