广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中程序如何调用Python脚本
  • 756
分享到

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

2024-04-02 19:04:59 756人浏览 薄情痞子
摘要

目录一、环境配置0x00 平台0x01 添加 包含目录 和 库目录0x02 添加依赖项二、案例三、常用api有时候在写C语言程序的时候又想利用一下pyt

有时候在写C语言程序的时候又想利用一下python强大的模块,于是C与Python的混合编程便应运而生。
下面简单说说在C语言编译环境中调用python脚本文件的基础应用。

一、环境配置

以vs2017为例。

0x00 平台

首先你要知道你电脑上安装的python环境是64位还是32位,vs的编译平台需要与python环境一致。
比如我的python环境是64位,vs工程就要配置成x64。

在这里插入图片描述

右键点击你的解决方案,点击属性,

在这里插入图片描述

0x01 添加 包含目录 和 库目录

在属性窗口双击“Vc++ Directories”(VC++目录),把在Include Directories (包含目录)和 Library Directories(库目录)下添加python安装路径下的include和ibs文件夹的路径。

在这里插入图片描述

0x02 添加依赖项

在添加之前一定要先确保自己安装了python的debug版本,详见我的另一篇博客【VS2017】“LNK1104 cannot open file ‘python39_d.lib‘

双击“linker”(链接器)下的“Input”,添加python39_d.lib这个依赖项

在这里插入图片描述

点击确定则配置完成。

这样在写程序的时候添加Python.h头文件就不会报错,python39_d.lib里的API函数也就可以正常使用了。

二、案例

主要流程就是:

  • 初始化python
  • 导入py脚本(模块)
  • 获取模块里的函数
  • 必要的C语言数据类型转python的数据类型(传参前)
  • 调用函数
  • 释放python

#include<stdio.h>
#include <Python.h>
int main()
{
	PyObject *pName, *pModule, *pDict, *pFunc;
	PyObject *pArgs, *pValue;
	//待传参数
	int time[6]={1,2,3,4,5,6};
	//初始化python
	Py_Initialize();
	// 检查初始化是否成功  
	if (!Py_IsInitialized())
	{
		printf("初始化失败\n");
		Py_Finalize();
	}
	//设置python模块,搜寻位置,文件放在.c文件一起
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");

	//获取python文件名,导入模块(我这里的py文件是graph.py) 
	pModule = PyImport_ImportModule("graph");
	if (!pModule) {
		printf("py文件导入失败\n");
		Py_Finalize();
	}
	else {
		//直接获取模块中的函数
		pFunc = PyObject_GetAttrString(pModule, "create_graph");
		//验证函数是否获取成功
		if (!pFunc) {
			printf("函数导入失败\n");
			Py_Finalize();
		}

		//将C/C++类型数据转换为python类型,利用元组传递
		pArgs = PyTuple_New(6);
		pValue = PyLong_FromLong(time[0]);
		PyTuple_SetItem(pArgs, 0, pValue);

		pValue = PyLong_FromLong(time[1]);
		PyTuple_SetItem(pArgs, 1, pValue);

		pValue = PyLong_FromLong(time[2]);
		PyTuple_SetItem(pArgs, 2, pValue);

		pValue = PyLong_FromLong(time[3]);
		PyTuple_SetItem(pArgs, 3, pValue);

		pValue = PyLong_FromLong(time[4]);
		PyTuple_SetItem(pArgs, 4, pValue);

		pValue = PyLong_FromLong(time[5]);
		PyTuple_SetItem(pArgs, 5, pValue);
		
		//调用直接获得的函数,并传递参数
		pValue = PyObject_CallObject(pFunc, pArgs);

		//释放python
		Py_Finalize();
		
		printf("success");
		return 0;
	}
}

顺便给出我的graph.py的脚本,这是一个以参数的数值生成对应的excel文件的脚本,这两个源代码是根据我的另一篇关于排序算法的博文改的案例。


# -*- coding:utf-8 -*-
import xlsxwriter

def create_graph(a,b,c,d,e,f):
	# 创建一个excel
	workbook = xlsxwriter.Workbook("排序算法比较结果.xlsx")
	# 创建一个sheet
	worksheet = workbook.add_worksheet()
	# worksheet = workbook.add_worksheet("bug_analysis")

	# 自定义样式,加粗
	bold = workbook.add_fORMat({'bold': 1})

	# --------1、准备数据并写入excel---------------
	# 向excel中写入数据,建立图标时要用到
	headings = ["排序方法", "排序时间"]
	data = [["简单选择排序", "直接插入排序", "冒泡排序", "快速排序", "两路合并排序", "堆排序"],[a,b,c,d,e,f]]
	
	# 写入表头
	worksheet.write_row('A1', headings, bold)
 
	# 写入数据
	worksheet.write_column('A2', data[0])
	worksheet.write_column('B2', data[1])
 
	# --------2、生成图表并插入到excel---------------
	# 创建一个柱状图(column chart)
	chart_col = workbook.add_chart({'type': 'column'})
 
	# 配置第一个系列数据
	chart_col.add_series({'name': '=Sheet1!$B$1','cateGories': '=Sheet1!$A$2:$A$7','values':   '=Sheet1!$B$2:$B$7','line': {'color': 'red'},})
	# 这里的sheet1是默认的值,因为我们在新建sheet时没有指定sheet名
	# 如果我们新建sheet时设置了sheet名,这里就要设置成相应的值
 
	# 设置图表的title 和 x,y轴信息
	chart_col.set_title({'name': "排序算法结果"})
	chart_col.set_x_axis({'name': "排序方法"})
	chart_col.set_y_axis({'name':  "花费时间(ms)"})
 
	# 设置图表的风格
	chart_col.set_style(1)
 
	# 把图表插入到worksheet以及偏移
	worksheet.insert_chart('A10', chart_col, {'x_offset': 25, 'y_offset': 10})
	
	workbook.close()
	return 0

if __name__=="__main__":
	create_graph(10, 40, 50, 20, 10, 50)

三、常用API

1、运行Python指令


PyRun_SimpleString("print(os.getcwd(),a)");
pyext.eval(R"(a+='qwer')");

2、加载Python模块


PyObject * pModule =PyImport_ImportModule("tp"); //test:Python文件名,若脚本有错则返回空
PyRun_SimpleString("import os");

3、给Python的变量赋值

对于数值,使用Py_BuildValue:


Py_BuildValue("") None
Py_BuildValue("i", 123) 123
Py_BuildValue("iii", 123, 456, 789) (123, 456, 789)
Py_BuildValue("s", "hello") 'hello'
Py_BuildValue("ss", "hello", "world") ('hello', 'world')
Py_BuildValue("s#", "hello", 4) 'hell'
Py_BuildValue("()") ()
Py_BuildValue("(i)", 123) (123,)  
Py_BuildValue("(ii)", 123, 456) (123, 456)
Py_BuildValue("(i,i)", 123, 456) (123, 456)
Py_BuildValue("[i,i]", 123, 456) [123, 456]
Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) {'abc': 123, 'def': 456}

对于其他数据结构,使用相应的函数设置,例如:


PyObject *pArgs = PyTuple_New(1);
PyObject *pDict = PyDict_New();  //创建字典类型变量 
PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "YQC")); //往字典类型变量中填充数据 
PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据 
PyTuple_SetItem(pArgs, 0, pDict);//0---序号 将字典类型变量添加到参数元组中 

构造好对象以后,通过PyObject_SetAttrString来设置进入Python中:


PyObject *ps=PyUnicode_DecodeUTF8(val,strlen(val),"ignore"); //构造了一个对象
PyObject_SetAttrString(p_main_Module,key,ps); //设置

4、获取Python变量的值

首先取得变量的指针,然后通过PyArg_Parse解析


pModule =PyImport_ImportModule("__main__");
pReturn = PyObject_GetAttrString(pModule, "a"); //可以获得全局变量
int size = PyDict_Size(pReturn); 
PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age"); 
int newAge;
PyArg_Parse(pNewAge, "i", &newAge); 

对于元组的解析:


PyObject * pfun=PyObject_GetAttrString(pModule, "testdict"); //testdict:Python文件中的函数名
PyObject *pReturn = PyEval_CallObject(pfun, pArgs); //调用函数

5、调用Python函数


PyObject * pfun=PyObject_GetAttrString(pModule, "testdict"); //testdict:Python文件中的函数名
PyObject *pReturn = PyEval_CallObject(pfun, pArgs); //调用函数

6、设置函数让Python调用

首先定义c函数,然后声明方法列表,然后声明模块,然后增加这个模块,最后调用


static int numargs=1890;
static PyObject* emb_numargs(PyObject *self, PyObject *args) //C函数
{
  if(!PyArg_ParseTuple(args, ":numargs"))
    return NULL;
  return PyLong_FromLong(numargs);
}
static PyMethodDef EmbMethods[] = { //方法列表
  {"numargs", emb_numargs, METH_VARARGS,
   "Return the number of arguments received by the process."},
  {NULL, NULL, 0, NULL}
};
static PyModuleDef EmbModule = { //模块声明
  PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,
  NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void) //模块初始化函数
{
  return PyModule_Create(&EmbModule);
}
//增加模块:
PyImport_AppendInittab("emb", &PyInit_emb); //增加一个模块

到此这篇关于C语言中程序如何调用Python脚本的文章就介绍到这了,更多相关C语言调用Python脚本内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言中程序如何调用Python脚本

本文链接: https://www.lsjlt.com/news/125808.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中程序如何调用Python脚本
    目录一、环境配置0x00 平台0x01 添加 包含目录 和 库目录0x02 添加依赖项二、案例三、常用API有时候在写C语言程序的时候又想利用一下pyt...
    99+
    2022-11-12
  • C#如何调用python脚本
    目录C#调用python脚本方式一方式二方式三方式四方式五C#调用python脚本 在平常工程项目开发过程中常常会涉及到机器学习、深度学习算法方面的开发任务,但是受限于程序设计语言本...
    99+
    2022-11-13
  • C语言程序怎么调用Python函数
    本篇文章为大家展示了C语言程序怎么调用Python函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python脚本,存为pytest.pydef add(a,b):  ...
    99+
    2023-06-17
  • Shell脚本里调用Python程序
    脚本背景:主管要求看门狗程序不仅仅只是看门,还要在看门成功的时候发送邮件给各个开发人员,而且必须要用公司原有的python程序作为发送邮件的主程序,所以需要在原有的看门狗程序上加一句话,而这个看门狗程序恰恰是shell程序,两种不同程序混搭...
    99+
    2023-01-31
    脚本 程序 Shell
  • C++中怎么调用Python脚本
    C++中怎么调用Python脚本,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。#test function   def add...
    99+
    2023-06-17
  • c语言如何单步调试程序
    要在C语言中进行单步调试程序,可以使用调试器。调试器是一个开发工具,可以帮助程序员在程序执行过程中逐行跟踪代码,查看变量的值,以及检...
    99+
    2023-08-24
    c语言
  • c语言主程序怎么调用子程序
    在C语言中,主程序可以通过函数调用的方式来调用子程序。以下是一个简单的示例:```c#include // 声明子程序void su...
    99+
    2023-10-12
    c语言
  • C++中怎么调用python脚本函数
    本篇文章给大家分享的是有关C++中怎么调用python脚本函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++调用python脚本函数代码如下:Py_Initialize(...
    99+
    2023-06-17
  • shell中如何调用python脚本
    要在shell中调用Python脚本,可以使用以下命令:```python script.py```其中,`python`是Pyth...
    99+
    2023-10-10
    shell python
  • python中如何调试脚本
    小编给大家分享一下python中如何调试脚本,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!调试脚本我们可以在 模块的帮助下在 Python 脚本中设置断点。请按照...
    99+
    2023-06-27
  • 如何使用shell脚本语言
    今天就跟大家聊聊有关如何使用shell脚本语言,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、shell的概述shell 是一种脚本语言脚本:本质是一个文件,文件里面存放的是 特定...
    99+
    2023-06-09
  • 在node中如何调用python脚本
    目录node调用python脚本使用场景1、准备运行环境,获取python路径2、前端把命令字符串和python路径传给后端3、服务端调用python脚本nodejs调用python...
    99+
    2022-11-13
  • 如何使用Dev C++编写C语言程序
    本篇内容介绍了“如何使用Dev C++编写C语言程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C语言是什么C语言是一门面向过程的、抽象化...
    99+
    2023-06-08
  • MacOs使用VS Code编译调试C语言程序
    参考博客:Windows/macOS使用VSCode搭建C/C++的开发/Debug环境 1. 在macOS安装VS Code 在微软官方下载适合macOS版本的VS Code。 2. 在VS Code的扩展里搜索并安装如下扩展 C/C++...
    99+
    2023-08-17
    macos c语言 vscode
  • 如何调用c语言函数
    如何调用c语言函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式...
    99+
    2023-06-15
  • c语言如何调用函数
    C语言中可以通过函数名和参数列表来调用函数。例如,假设有一个名为`add`的函数,接受两个整数作为参数,并返回它们的和。调用函数的一...
    99+
    2023-09-04
    c语言
  • c语言如何写驱动程序
    编写C语言驱动程序需要以下步骤: 了解硬件设备:首先,你需要了解要驱动的硬件设备的规格和功能,包括设备寄存器地址、设备操作方式等...
    99+
    2023-10-24
    c语言
  • 如何使用awk语言编写脚本
    这篇文章主要介绍“如何使用awk语言编写脚本”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用awk语言编写脚本”文章能帮助大家解决问题。awk是一种编程语言,用于在linux/unix下对文本...
    99+
    2023-06-27
  • 如何用C#语言构造蜘蛛程序
    这篇文章主要介绍“如何用C#语言构造蜘蛛程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用C#语言构造蜘蛛程序”文章能帮助大家解决问题。   "蜘...
    99+
    2022-10-19
  • C++如何调用简单的python程序
    目录一、基本环境的搭建二、直接在C++里面调用执行python语句三、调用python脚本文件里面的定义函数调用不含参数的函数调用含多个参数的函数总结一、基本环境的搭建 首先,用vs...
    99+
    2023-02-17
    C++调用python程序 C++调用python C++调用python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作