C++ 混合Python编程 及 Visual Studio配置

文章目录

需求

接手了一个C++应用程序,解析csv和生成csv文件,但是如果要把多个csv文件合并成一个Excel,分布在不同的Sheet中,又想在一次运行中完成,不想说运行完C++ 的App后,再调用一个Python脚本或程序,这需要两步操作

配置环节

明确安装的是64位

根据安装的Visual Studio 的版本,我安装的是64-bit的。 如何查看当前Python已安装的python位数或者版本

在cmd模式下输入python,可以看到已安装64bit版本,

shell 复制代码
C:\Users\xxx>python
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
shell 复制代码
C:\Users\xxx>where python
C:\Program Files\Python310\python.exe
C:\Users\xxx\AppData\Local\Microsoft\WindowsApps\python.exe

Python安装目录

- python.h 所在目录: C:\Program Files\Python310\include

  • python libraries 目录: C:\Program Files\Python310\libs

当设置Visual Studio工程属性时,需要用到上述目录

创建Console C++ Project

创建一个工程,然后配置工程属性

Cpp 调用 Python Demo

参考代码

cpp 复制代码
#include <Windows.h>
#include <iostream>
#include <string>
#include <Python.h>


using namespace std;

// https://docs.python.org/3/extending/embedding.html
void CallPython(string PythonModuleName, string PythonFunctionName)
{
	char* funcname = new char[PythonFunctionName.length() + 1];
	strcpy_s(funcname, PythonFunctionName.length() + 1, PythonFunctionName.c_str());

	char* modname = new char[PythonModuleName.length() + 1];
	strcpy_s(modname, PythonModuleName.length() + 1, PythonModuleName.c_str());

	printf("Hit any key to initialize the Python interpreter\n");
	system("pause");

	// Initialize the Python interpreter 
	// https://docs.python.org/3/c-api/init.html#c.Py_Initialize
	Py_Initialize();

	TCHAR cwd[2048];
	GetCurrentDirectory(sizeof(cwd), cwd);

	// Import a module. This is best described by referring to the built-in Python function __import__().
	// https://docs.python.org/3/c-api/import.html?highlight=pyimport_importmodule#c.PyImport_ImportModule 
	printf("Hit any key to Load the Python module %ws - %s\n", cwd, modname);
	system("pause");
	PyObject* my_module = PyImport_ImportModule(modname);

	// Print a standard traceback to sys.stderr and clear the error indicator
	// https://docs.python.org/3/c-api/exceptions.html?highlight=pyerr_print#c.PyErr_Print
	PyErr_Print();

	printf("Module found\n");
	printf("Hit any key to find function %s from Python module %ws\n", funcname, cwd);
	system("pause");

	// Get the address of the particular Python function in the imported module
	// https://docs.python.org/3/c-api/object.html?highlight=pyobject_getattrstring#c.PyObject_GetAttrString
	printf("Getting address of %s in Python module\n", funcname);
	PyObject* my_function = PyObject_GetAttrString(my_module, funcname);

	PyErr_Print();

	printf("Function found\n");
	printf("Hit any key to call function %s from Python module %ws\n", funcname, cwd);
	system("pause");

	// Call a callable Python object callable, with arguments given by the tuple args. 
	// If no arguments are needed, then args can be NULL.
	// https://docs.python.org/3/c-api/call.html?highlight=pyobject_callobject#c.PyObject_CallObject
	PyObject* my_result = PyObject_CallObject(my_function, NULL);

	PyErr_Print();

	printf("Your function has been called\n");
	system("pause");

	// Undo all initializations made by Py_Initialize() and subsequent use of Python/C API functions, 
	// and destroy all sub-interpreters (see Py_NewInterpreter() below) that were created and not yet 
	// destroyed since the last call to Py_Initialize(). Ideally, this frees all memory allocated by the Python interpreter.
	// https://docs.python.org/3/c-api/init.html?highlight=py_finalize#c.Py_FinalizeEx
	Py_Finalize();

	delete[] funcname;
	delete[] modname;
}

int main()
{
	CallPython("PythonFile", "helloworld");
	system("pause");
	return 0;
}

上述代码编译通过后,如果直接运行,会Failed, 原因是我们并没有定义PythonFile module.在Debug模式下,生成的exe文件在x64目录下:

python 复制代码
import re
import string

def helloworld():
	print("Hello from Python!")

main函数内,

  • PythonFile 对应了 PythonModuleName
  • helloworld 对应了 PythonFunctionName

运行Demo后的输出结果

shell 复制代码
Hit any key to initialize the Python interpreter
请按任意键继续. . .
Hit any key to Load the Python module C:\Resource\App\Python\CppPython\CppPython - PythonFile
请按任意键继续. . .
Module found
Hit any key to find function helloworld from Python module C:\Resource\App\Python\CppPython\CppPython
请按任意键继续. . .
Getting address of helloworld in Python module
Function found
Hit any key to call function helloworld from Python module C:\Resource\App\Python\CppPython\CppPython
请按任意键继续. . .
Hello from Python!
Your function has been called
请按任意键继续. . .
请按任意键继续. . .

参考

C++与Python混合编程

相关推荐
wgzrmlrm744 小时前
如何解决ORA-28040没有匹配的验证协议_sqlnet.ora版本兼容设置
jvm·数据库·python
维度攻城狮4 小时前
pycallgraph2drawio:Python 调用链可视化 + Draw.io 自由编辑
开发语言·python·draw.io·graphviz
极光代码工作室4 小时前
基于NLP的智能客服系统设计与实现
python·深度学习·机器学习·ai·自然语言处理
Mr_Xuhhh4 小时前
深入Java多线程进阶:从锁策略到并发工具全解析
前端·数据库·python
念恒123064 小时前
Linux初识
linux·服务器·c++
旖-旎5 小时前
哈希表(存在重复元素)(3)
数据结构·c++·学习·算法·leetcode·散列表
apcipot_rain5 小时前
Python实战——蒙特卡洛模拟分析杀牌游戏技能收益
python·游戏·数学建模
计算机安禾5 小时前
【数据结构与算法】第39篇:图论(三):最小生成树——Prim算法与Kruskal算法
开发语言·数据结构·c++·算法·排序算法·图论·visual studio code
老绿光5 小时前
Python 字典完全指南:从入门到实战
linux·服务器·python
fish_xk5 小时前
c++内存管理
开发语言·c++·算法