C++如何调用简单的python程序

目录
  • 一、基本环境的搭建
  • 二、直接在C++里面调用执行python语句
  • 三、调用python脚本文件里面的定义函数
    • 调用不含参数的函数
    • 调用含多个参数的函数
  • 总结

一、基本环境的搭建

首先,用vs创建一个win32的控制台应用程序项目(vs2017及以上怎么创建百度一下就知道了)。

然后配置好python的环境变量(把include文件夹加到包含目录,libs文件夹加到库目录,最好还把include文件夹加到附加包含目录)。

如下图所示:

最后,把python36.libs文件加到依赖项(如果是debug编译,要重命名python36.libs为python36_d.libs,然后加到依赖项)

如下图所示。

二、直接在C++里面调用执行python语句

搭建好一中的环境之后,在源文件里面新建一个cpp文件,cpp里面的代码如下。

代码很简单,应该一看就懂了吧。

#include <Python.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
	//***python调用***//
	//直接在C++里面执行python语句
	void usePythonWorld();
	usePythonWorld();
	system("pause");
}
void usePythonWorld()//调用无参数函数
{
	//初始化python模块:用来分配python解释器所使用的全局资源
	Py_SetPath(L"D:/chengxuanzhuang/anaconda/envs/python3.6/Lib");
	Py_Initialize();
	if (!Py_IsInitialized())// 检查初始化是否成功
	{
		cout << "初始化失败" << endl;
		Py_Finalize();
	}
	//直接调用python语句(没有成功)
	PyRun_SimpleString("print('in python'\n)");
	Py_Finalize();

}

需要注意的地方是,在使用PyRun_SimpleString之前,一定要使用 Py_Initialize()初始化Python。

三、调用python脚本文件里面的定义函数

调用不含参数的函数

搭建好一中的环境之后,在源文件里面新建一个cpp文件,cpp里面的代码如下。

代码很简单,应该一看就懂了吧。

#include <Python.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
	//***python调用***//
	//调用无参数python函数
	bool InvokeNonParasFuncByAPI(string module, string func);
	InvokeNonParasFuncByAPI("PythonGreet", "Hello");
	system("pause");
}
bool InvokeNonParasFuncByAPI(string module, string func)
{
	Py_SetPath(L"D:/chengxuanzhuang/anaconda/envs/python3.6/Lib");
	Py_Initialize();
	if (!Py_IsInitialized())
	{
		return false;
	}
	try
	{
		//将当前目录切换到python脚本放置的目录,因为初始化到了python的全局资源下,所以只能只用python语句
		PyRun_SimpleString("import sys\n");
		PyRun_SimpleString("sys.path.append('./')");//这个一个简单的执行python脚本命令的函数,由于路径是'./',所以python脚本要放在这个项目的根目录

		//调用pyhton脚本
		PyObject* moduleName = PyUnicode_FromString(module.c_str());
		PyObject* pModule = PyImport_Import(moduleName);
		if (!pModule)
		{
			cout << "Import Module Failed" << endl;
			return false;
		}
		PyObject* pFunc = PyObject_GetAttrString(pModule, func.c_str());//调用脚本里面的函数
		if (!pFunc || !PyCallable_Check(pFunc)) //这里面的这个函数是用来判断方法是否有效
		{
			cout << "Get Function Failed!" << endl;
			return false;
		}
		PyObject* pResult = PyObject_CallObject(pFunc, nullptr);//使用python脚本里面的函数
		if (!pResult)
		{
			cout << "Get Result of Function Failed!" << endl;
			return false;
		}
	}
	catch (...)
	{
		PyErr_Print(); //如果出错会打印出错误
		PyErr_Clear();
		Py_Finalize();
		return false;
	}
	Py_Finalize();
	return true;
}

调用含一个参数的函数

搭建好一中的环境之后,在源文件里面新建一个cpp文件,cpp里面的代码如下。

代码很简单,应该一看就懂了吧。

其中的demo_test是python脚本文件名,注意不是demo_test.py。最后把这个python脚本文件和cpp文件放在同一个文件夹下(注意不是放在源文件里,而是找到cpp文件所在的文件夹,放到这个文件夹里。

如下。如果是在项目里直接创建的python文件,会自动存放到这个文件夹下)

不出意外,就可以运行这个cpp文件了。

调用含多个参数的函数

搭建好一中的环境之后,在源文件里面新建一个cpp文件,cpp里面的代码如下。

代码很简单,应该一看就懂了吧。

#include <Python.h>
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	//***python调用***//
	//调用含参数的python函数
	vector<int> paras;
	paras.push_back(3);
	paras.push_back(4);
	bool InvokeFuncbyAPI(string module, string func, vector<int> paras);
	InvokeFuncbyAPI("PythonCalc", "Add",paras);
	system("pause");
}
bool InvokeFuncbyAPI(string module, string func,vector<int> paras)
{
	Py_SetPath(L"D:/chengxuanzhuang/anaconda/envs/python3.6/Lib");
	Py_Initialize();
	if (!Py_IsInitialized())
	{
		return false;
	}
	try
	{
		//将当前目录切换到python脚本放置的目录,因为初始化到了python的全局资源下,所以只能只用python语句
		PyRun_SimpleString("import sys\n");
		PyRun_SimpleString("sys.path.append('./')");//这个一个简单的执行python脚本命令的函数,由于路径是'./',所以python脚本要放在这个项目的根目录

		//调用pyhton脚本
		PyObject* moduleName = PyUnicode_FromString(module.c_str());
		PyObject* pModule = PyImport_Import(moduleName);
		if (!pModule)
		{
			cout << "Import Module Failed" << endl;
			return false;
		}
		PyObject* pFunc = PyObject_GetAttrString(pModule, func.c_str());//调用脚本里面的函数
		if (!pFunc || !PyCallable_Check(pFunc)) //这里面的这个函数是用来判断方法是否有效
		{
			cout << "Get Function Failed!" << endl;
			return false;
		}
		PyObject* pResult = nullptr; //创建一个获取结果的python数据结构
		PyObject* args = PyTuple_New((int)paras.size());//建立一个存放入参的python数据结构
		for (int i = 0; i < (int)paras.size(); i++)
		{
			PyTuple_SetItem(args, i, PyLong_FromLong(paras[i])); //将C++的参数转化为python的参数
		}
		pResult = PyObject_CallObject(pFunc, args);
		if (!pResult)
		{
			cout << "Get Result of Function Failed!" << endl;
			return false;
		}
		cout << "Result = " << PyLong_AsLong(pResult) << "by python api" << endl;

	}
	catch (...)
	{
		PyErr_Print();//如果出错会打印出错误
		PyErr_Clear();
		Py_Finalize();
		return false;
	}
	Py_Finalize();
	return true;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言中程序如何调用Python脚本

    有时候在写C语言程序的时候又想利用一下python强大的模块,于是C与python的混合编程便应运而生. 下面简单说说在C语言编译环境中调用python脚本文件的基础应用. 一.环境配置 以vs2017为例. 0x00 平台 首先你要知道你电脑上安装的python环境是64位还是32位,vs的编译平台需要与python环境一致. 比如我的python环境是64位,vs工程就要配置成x64. 右键点击你的解决方案,点击属性, 0x01 添加 包含目录 和 库目录 在属性窗口双击"VC++ Dire

  • C++调用python(执行py文件)的全过程

    1.首先要配好vs开发工程 注意版本:我这使用32位的python那么我vs工程这边也选择32位的编译环境去配置 注意点:需要将python安装目录的一些文件拷过来作为vs工程使用. 2.C++调用Python结果 py代码 这里引用了cdll库也需要放置到运行目录,py文件也是需要放置到运行目录(也就是exe生成所在目录) import os import time from ctypes import * def testDLL(): pDll = CDLL("./pythonTestCDl

  • 详解C++调用Python脚本中的函数的实例代码

    1.环境配置 安装完python后,把python的include和lib拷贝到自己的工程目录下 然后在工程中包括进去 2.例子 先写一个python的测试脚本,如下 这个脚本里面定义了两个函数Hello()和_add().我的脚本的文件名叫mytest.py C++代码: #include "stdafx.h" #include <stdlib.h> #include <iostream> #include "include\Python.h&quo

  • C++如何调用简单的python程序

    目录 一.基本环境的搭建 二.直接在C++里面调用执行python语句 三.调用python脚本文件里面的定义函数 调用不含参数的函数 调用含多个参数的函数 总结 一.基本环境的搭建 首先,用vs创建一个win32的控制台应用程序项目(vs2017及以上怎么创建百度一下就知道了). 然后配置好python的环境变量(把include文件夹加到包含目录,libs文件夹加到库目录,最好还把include文件夹加到附加包含目录). 如下图所示: 最后,把python36.libs文件加到依赖项(如果是

  • 使用PDB简单调试Python程序简明指南

    在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入 pdb 模块(假设要调试的程序名为 d.py): 复制代码 代码如下: $ vi d.py #!/usr/bin/python def main():         i, sum = 1, 0         for i in xrange(100):                 sum = sum + i         print sum if __name__ == '__main__'

  • 编写简单的Python程序来判断文本的语种

    1.问题的描述 用Python进行文本处理时,有时候处理的文本中包含中文.英文.日文等多个语系的文本,有时候不能同时进行处理,这个时候就需要判别当前文本是属于哪个语系的.Python中有个langid工具包提供了此功能,langid目前支持97种语言的检测,非常好用. 2.程序的代码 以下Python是调用langid工具包来对文本进行语言检测与判别的程序代码: import langid #引入langid模块 def translate(inputFile, outputFile): fin

  • 操作Windows注册表的简单的Python程序制作教程

    通过Python操作注册表有两种方式,第一种是通过Python的内置模块 _winreg:另一种方式就是Win32 Extension For Python 的win32api模块,但是需要进行额外的安装.这里主要给出一些_winreg和win32api的Demo代码. 1. _winrg 可以参考官方的参考文档: http://docs.python.org/library/_winreg.html http://www.python.org/doc/2.6.2/library/_winreg

  • 一个简单的python程序实例(通讯录)

    核心代码: 复制代码 代码如下: #!/usr/bin/python#Filename:friendbook.pyimport cPickle as pimport sysimport timeimport os ab={'Xdex':'cneds@fnedf.com',        'Laexly':'fev@fe.com',        'Fukc':'fexok@ver.com',        'Stifu':'stif@qq.com'} def Dumpfile(list):   

  • Python程序打包成可执行文件exe详解流程

    今天给大家分享个可视化 Python 打包神器,欢迎点赞支持,文末提供技术交流群. 1. 什么是 auto-py-to-exe auto-py-to-exe 是一个用于将Python程序打包成可执行文件的图形化工具.本文就是主要介绍如何使用 auto-py-to-exe 完成 python 程序打包.auto-py-to-exe 基于 pyinstaller ,相比于 pyinstaller ,它多了 GUI 界面,用起来更为简单方便 2.安装 auto-py-to-exe 首先我们要确保我们的

  • pyinstaller将python程序打包为可执行文件

    目录 前言 pyinstaller简介 pyinstaller下载 pyinstaller使用 准备好程序代码 打包程序 小结 前言 对于专业的python程序员来说,python打包工具或许用得并不多.但是对于非专业人士来说,你给他写个python项目,要让他安装python.安装依赖等等,估计人都会抓狂.或者说,如果你不想暴露自己的项目代码,python打包工具就派上用场了,市面上有多种打包工具,这里就讲讲最常用的pyinstaller的使用方法吧. pyinstaller简介 pyinst

  • 使用C语言扩展Python程序的简单入门指引

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中. 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C++几乎相同的执行性能.执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人

  • 使用Python制作简单的小程序IP查看器功能

    前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固定的关系,所以我们需要借助网络上的数据库,或者说借助第三方的服务来查询.这里,我们选用IP.CN提供的IP地址查询服务. 基本环境配置 版本:Python3 系统:Windows 相关模块:PyQt5 实现效果图 完整代码 运行以上程序,点击按钮,大约卡顿半秒后,文本标签处就会显示我们电脑的IP地址

  • python 实现简单的FTP程序

    FTP即文件传输协议:它基于客户机-服务器模型体系结构,应用广泛.它有两个通道:一个命令通道和一个数据通道.命令通道用于控制通信,数据通道用于文件的实际传输.使用FTP可以做很多事情,比如移动.下载.复制文件等. 一.开发环境 server端:centos 7  python-3.6.2 客户端:Windows 7 python-3.6.2 pycharm-2018 程序目的:1.学习使用socketserver实现并发处理多个客户端.            2.了解使用struct解决TCP粘

随机推荐