文章目录
0. 工具介绍
用到的工具:
- Microsoft Visual Studio Community 2022
- Visual Studio Code
1. 配置环境
1.1 新建控制台应用程序
此处代码不太符合个人编码习惯,故稍加修改,修改后图如下:
检测代码是否能够运行:
1.2 配置Python环境
配置Python的lib库
1.3 执行Python脚本语句
#include <iostream>
#include <Python.h>
using namespace std;
int main()
{
cout << "Hello World!\n";
// 1. 设置Python的运行环境目录
Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
// 2. 初始化python解释器
Py_Initialize();
// 2.1 检查初始化是否成功
if (!Py_IsInitialized()) {
cout << "初始化失败" << endl;
Py_Finalize();
}
// 2.2 执行Python脚本语句
PyRun_SimpleString("print('I am Python!')");
// 3. 清理Python解释器
Py_Finalize();
}
1.4 运行Python脚本
1.4.1 新建Python脚本文件
在本项目文件夹下新建python脚本文件PyTest01.py
,脚本内代码如下:
print("我来自Python脚本文件")
for i in range(10):
print(i)
1.4.2 修改代码
#include <iostream>
#include <Python.h>
using namespace std;
int main()
{
cout << "Hello World!\n";
// 1. 设置Python的运行环境目录
Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
// 2. 初始化python解释器
Py_Initialize();
// 2.1 检查初始化是否成功
if (!Py_IsInitialized()) {
cout << "初始化失败" << endl;
Py_Finalize();
}
// 2.2 执行Python脚本语句
PyRun_SimpleString("print('I am Python!')");
// 2.3 执行Python脚本文件
const char* name = "PyTest01.py";
FILE* fp = fopen(name, "r");
PyRun_AnyFile(fp, name);
// 3. 清理Python解释器
Py_Finalize();
}
1.4.3 运行
发生报错:
报错语句如下:
1>Project01.cpp
1>F:\VS_project\Project01\Project01\Project01.cpp(26,16): error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>已完成生成项目“Project01.vcxproj”的操作 - 失败。
========== “生成”: 0 成功,1 失败,0 更新,0 已跳过 ==========
原因分析:
VS认为我们用fopen
打开文件不安全,让我们采用fopen_s
。我们可以在项目中属性页
配置忽略这条报错即可。
继续运行
2. 调用Python函数
2.1 新建Python脚本
- 新建
PyFun.py
def pyfun():
print("这是一个无参无返回值的函数")
def pyfun_return_value():
print("这是一个无参有返回值的函数")
return 123
def pyfun_return_value_with_parameter(arg1, arg2):
print("这是一个有参有返回值的函数")
print("arg1:", arg1)
print("arg2:", arg2)
return 456
2.2 调用无参无返回值的函数
#include <iostream>
#include <Python.h>
using namespace std;
int main()
{
cout << "Hello World!\n";
// 1. 设置Python的运行环境目录
Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
// 2. 初始化python解释器
Py_Initialize();
// 2.1 检查初始化是否成功
if (!Py_IsInitialized()) {
cout << "初始化失败" << endl;
Py_Finalize();
}
2.2 执行Python脚本语句
//PyRun_SimpleString("print('I am Python!')");
2.3 执行Python脚本文件
//const char* name = "PyTest01.py";
//FILE* fp = fopen(name, "r");
//PyRun_AnyFile(fp, name);
// 2.4 调用Python函数
PyObject* mod = PyImport_GetModule(PyUnicode_FromString("__main__"));
FILE* fp = fopen("PyFun.py", "r");
PyRun_AnyFile(fp, "PyFun.py");
PyObject* func = PyObject_GetAttrString(mod, "pyfun");
PyObject_CallObject(func, 0);
fclose(fp);
Py_XDECREF(func);
Py_XDECREF(mod);
// 3. 清理Python解释器
Py_Finalize();
}
2.3 调用无参有返回值的函数
#include <iostream>
#include <Python.h>
using namespace std;
int main()
{
cout << "Hello World!\n";
// 1. 设置Python的运行环境目录
Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
// 2. 初始化python解释器
Py_Initialize();
// 2.1 检查初始化是否成功
if (!Py_IsInitialized()) {
cout << "初始化失败" << endl;
Py_Finalize();
}
2.2 执行Python脚本语句
//PyRun_SimpleString("print('I am Python!')");
2.3 执行Python脚本文件
//const char* name = "PyTest01.py";
//FILE* fp = fopen(name, "r");
//PyRun_AnyFile(fp, name);
// 2.4 调用Python函数
PyObject* mod = PyImport_GetModule(PyUnicode_FromString("__main__"));
FILE* fp = fopen("PyFun.py", "r");
PyRun_AnyFile(fp, "PyFun.py");
PyObject* func = PyObject_GetAttrString(mod, "pyfun_return_value");
cout << PyLong_AsLong(PyObject_CallObject(func, 0)) << endl;
fclose(fp);
Py_XDECREF(func);
Py_XDECREF(mod);
// 3. 清理Python解释器
Py_Finalize();
}
2.4 调用有参有返回值的函数
#include <iostream>
#include <Python.h>
using namespace std;
int main()
{
cout << "Hello World!\n";
// 1. 设置Python的运行环境目录
Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
// 2. 初始化python解释器
Py_Initialize();
// 2.1 检查初始化是否成功
if (!Py_IsInitialized()) {
cout << "初始化失败" << endl;
Py_Finalize();
}
2.2 执行Python脚本语句
//PyRun_SimpleString("print('I am Python!')");
2.3 执行Python脚本文件
//const char* name = "PyTest01.py";
//FILE* fp = fopen(name, "r");
//PyRun_AnyFile(fp, name);
// 2.4 调用Python函数
PyObject* mod = PyImport_GetModule(PyUnicode_FromString("__main__"));
FILE* fp = fopen("PyFun.py", "r");
PyRun_AnyFile(fp, "PyFun.py");
PyObject* func = PyObject_GetAttrString(mod, "pyfun_return_value_with_parameter");
PyObject* tuple = PyTuple_New(2);
PyTuple_SetItem(tuple, 0, PyLong_FromLong(555));
PyTuple_SetItem(tuple, 1, PyUnicode_FromString("PyFunc with parameters!"));
cout << PyLong_AsLong(PyObject_CallObject(func, tuple)) << endl;
Py_XDECREF(tuple);
Py_XDECREF(func);
Py_XDECREF(mod);
// 3. 清理Python解释器
Py_Finalize();
}