C/C++调用python

本文介绍如何在C++项目中调用Python接口,包括安装32位Python环境,通过Visual Studio(VS)创建项目并配置相关库,解决编译过程中的错误,如设置Python环境、导入模块等问题。提供了详细的步骤和解决常见问题的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在的业务需要在QT软件中调用python的接口,最好在运行环境中免安装python,话不多说,下面是操作流程。

一、安装32位python

  1. 因为C++项目需要生成32程序,因此我们需要先安装32位python。
  2. 首先设置anaconda进入 32 位模式,在Anaconda Prompt执行set CONDA_FORCE_32BIT=1,然后再创建环境默认就是 32 位的 Python了。使用 conda info 可查看该环境的详细信息。恢复 64 位模式,使用命令 set CONDA_FORCE_32BIT=0。
  3. 创建python环境:conda create -n py36_32 python=3.6
  4. 激活环境:activate py36_32,然后安装对应包

二、VS调用python程序

  1. 新建文件夹,命名为Python36,Python36的内部文件均来自于你安装的python环境,包括DLLs、include、Lib、libs、所有的dll文件(有了这些文件系统不安装python也是可以运行的了),具体如下:

  2. 新建VS空项目,命名为C_python,添加新项目main.cpp,内容如下:

#include "Python.h"
int main(int argc, char *argv[])
{
   
   
	Py_SetPythonHome((wchar_t*)(L"./Python36"));
	Py_Initialize(); /*初始化python解释器,告诉编译器要用的python编译器*/
	if (!Py_IsInitialized())
	{
   
   
		printf("Cant Py_IsInitialized !\n"); 
		return 0;
	}
	PyRun_SimpleString("print('helloworld!')");<
### C/C++ 调用 Python 函数并传递参数 #### 使用 `Pybind11` 实现 C++Python 交互 为了使 C++ 程序能够调用 Python 中定义的功能,可以采用多种方法。其中一种流行的方法是利用 `pybind11` 库来简化这一过程[^2]。 安装好必要的依赖之后,在C++端编写如下代码: ```cpp #include <iostream> #include <pybind11/embed.h> // everything needed for embedding namespace py = pybind11; int main() { py::scoped_interpreter guard{}; // start the interpreter and keep it alive auto plus_function = py::module_::import("example").attr("add"); int a = 9; double b = 3.14; try{ float result = plus_function(a, b).cast<float>(); std::cout << "The sum of " << a << " + " << b << " is: " << result << '\n'; } catch (const py::error_already_set& e){ PyErr_Print(); } } ``` 这段代码展示了如何导入名为 `"example"` 的模块,并从中获取一个叫做 `add` 的函数对象;接着创建两个数值类型的变量作为输入给该函数,最后捕获异常处理可能发生的错误情况。 #### 基于 Python API 扩展方式 另一种更为底层的方式涉及直接操作Python解释器API来进行跨语言通信。这种方式相对更灵活但也更加复杂一些。下面是一个简单的例子说明怎样设置环境以及调用带有参数的Python函数[^1]。 首先初始化Python解释器: ```cpp // 初始化Python解释器 Py_Initialize(); if (PyErr_Occurred()) { PyErr_Print(); } // 添加当前目录至Python路径以便找到本地.py文件 PyRun_SimpleString("import sys\n" "sys.path.append('./')"); ``` 随后加载目标`.py`文件里的特定功能: ```cpp PyObject* pName = PyUnicode_DecodeFSDefault("example"); PyObject* pModule = PyImport_Import(pName); Py_DECREF(pName); if (!pModule) { PyErr_Print(); } else { PyObject *pFunc = PyObject_GetAttrString(pModule,"multiply"); if (pFunc && PyCallable_Check(pFunc)) { PyObject *args = PyTuple_New(2); PyObject *arg1 = PyLong_FromLong(5L); PyObject *arg2 = PyFloat_FromDouble(2.7f); PyTuple_SetItem(args, 0, arg1); PyTuple_SetItem(args, 1, arg2); PyObject *resultObj = PyObject_CallObject(pFunc,args); if(resultObj != NULL){ printf("Result of multiply function call: %ld\n", PyLong_AsLong(resultObj)); Py_DECREF(resultObj); } Py_DECREF(args); Py_XDECREF(pFunc); } Py_DECREF(pModule); } Py_Finalize(); ``` 上述片段实现了从指定名称的空间里提取出乘法运算符对应的实体,并向其提供整数与浮点型数据作为实参完成一次远程调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值