C语言调用云端 Python接口

利用C语言调用阿里云Python接口,来实现垃圾的智能识别

文章目录

  • 利用C语言调用阿里云Python接口,来实现垃圾的智能识别
    • 1、如何开启阿里云服务
    • 2、实验程序介绍
      • 2.1 `py`程序改造
      • 2.2 c语言调用`py`
      • 2.3 测试代码
    • 3、实验结果

1、如何开启阿里云服务

大家可以自行在官网上面选择并开启,只有一次免费调用机会,于是我充了2块钱(恶毒的资本家)

垃圾分类识别常用语言和示例有哪些_视觉智能开放平台(VIAPI)-阿里云帮助中心 (aliyun.com)

2、实验程序介绍

2.1 py程序改造

  • 我们需要改造下阿里云提供给我们的代码,封装成一个函数,供后C程序调用

没学过Python也没关系,我们不需要改很多,有c的基础,知道.py文件是上面功能就ok。

# garbage.py
# -*- coding: utf-8 -*-
# 引入依赖包
# pip install alibabacloud_imagerecog20190930

import os
import io
from urllib.request import urlopen
from alibabacloud_imagerecog20190930.client import Client
from alibabacloud_imagerecog20190930.models import ClassifyingRubbishAdvanceRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions

config = Config(
  # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
  # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
  # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
  access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
  access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
  # 访问的域名
  endpoint='imagerecog.cn-shanghai.aliyuncs.com',
  # 访问的域名对应的region
  region_id='cn-shanghai'
)

def alibaba_garbage(): # 封装成一个函数,方便其他文件调用
  #场景一:文件在本地
  ###
  img = open(r'/home/orangepi/garbage/lj/test2.jpg','rb')#这边是我们自定义的文件目录
  ###
  # img = open(r'/tmp/garbage.jpg','rb')
  #场景二:使用任意可访问的url
  # url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/imagerecog/ClassifyingRubbish/ClassifyingRubbish1.jpg'
  # img = io.BytesIO(urlopen(url).read())
  classifying_rubbish_request = ClassifyingRubbishAdvanceRequest()
  classifying_rubbish_request.image_urlobject = img
  runtime = RuntimeOptions()
  try:
    # 初始化Client
    client = Client(config)
    response = client.classifying_rubbish_advance(classifying_rubbish_request, runtime)
    # 获取整体结果
    # print(response.body) # 默认
    # print(response.body.to_map()) # 打印出body的类型
    print(response.body.to_map()['Data']['Elements'][0]['Category']) # 打印出body的类型
    return response.body.to_map()['Data']['Elements'][0]['Category']
    # 提供调用方便
  except Exception as error:
    # 获取整体报错信息
    # print(error)
    # 获取单个字段
    # print(error.code)
    return '获取失败'

if __name__== "__main__": #这是主函数哦
  alibaba_garbage() #调用我们前面封装的函数

2.2 c语言调用py

  • 前面的文章讲过啦,不懂得同学可以回去看看;

    在Linux环境底下 用C语言执行Python程序-CSDN博客

  • 程序

// garbage.c
// C语言引用Python文件
#if 0
/*
1、包含Python.h头文件,以便使用Python API。
2、使用void Py_Initialize()初始化Python解释器,
3、使用PyObject *PyImport_ImportModule(const char *name)和PyObject
*PyObject_GetAttrString(PyObject *o, const char *attr_name)获取sys.path对象,并利用
int PyList_Append(PyObject *list, PyObject *item)将当前路径.添加到sys.path中,以便加载
当前的Python模块(Python文件即python模块)。
4、使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否
有错误。
5、使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取
Python函数对象,并检查是否可调用。
+6、使用PyObject *Py_BuildValue(const char *format, ...)函数将C类型的数据结构转换成
Python对象,作为Python函数的参数,没有参数不需要调用
7、使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用
Python函数,并获取返回值。
+8、使用int PyArg_Parse(PyObject *args, const char *format, ...)函数将返回值转换为C类
型,并检查是否有错误,没有返回值时不需要调用。
9、使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。
10、结束时调用void Py_Finalize()函数关闭Python解释器。
相关的函数参数说明参考网站(网站左上角输入函数名即可开始搜索):
https://docs.python.org/zh-cn/3/c-api/import.html
*/
#endif

#include <Python.h>
#include "garbage.h"


void garbage_init(void)
{
    Py_Initialize();
    // 将当前路径添加到sys.path中
    PyObject *sys = PyImport_ImportModule("sys");//初始化python解释器
    PyObject *path = PyObject_GetAttrString(sys, "path");
    PyList_Append(path, PyUnicode_FromString("."));
}

void garbage_final(void)
{
    //释放所有引用的Python对象
    Py_Finalize();
}
char *garbage_category(char *category)
{
    // 导入para模块
    PyObject *pModule = PyImport_ImportModule("garbage");//引用的是本目录底下的garbage.py文件
    if (!pModule)
    {
        PyErr_Print();
        printf("Error: failed to load para.py\n");
        goto FAILED_MODULE;
    }
    //获取 alibaba_garbage 函数对象
    PyObject *pFunc = PyObject_GetAttrString(pModule, "alibaba_garbage");
    //garbage.py文件里的这个函数 alibaba_garbage
    if (!pFunc)
    {
        PyErr_Print();
        printf("Error: failed to load say_funny\n");
        goto FAILED_FUNC;
    }

    //调用alibaba_garbage函数并获取返回值
    PyObject *pValue = PyObject_CallObject(pFunc, NULL);
    if (!pValue)
    {
        PyErr_Print();
        printf("Error: function call failed\n");
        goto FAILED_VALUE;
    } 
    //将返回值转换为C类型
    char *result = NULL;  //pValue(py) --> result(c)
    if (!PyArg_Parse(pValue, "s", &result))//PyArg_Parse根据指定的格式字符串将 Python 对象转换为 C 变量
    {
        PyErr_Print();
        printf("Error: parse failed\n");
        goto FAILED_RESULT;
    }
    //打印返回值
    printf("pValue=%s\n", result);
    category = (char*)malloc(sizeof(char)*(strlen(result)+1));//要留一个字节给 \0
    memset(category, 0, (strlen(result)+1));
    strncpy(category, result,(strlen(result)+1));//复制字符串
    

//会用来标识某个测试案例、任务或计划未能通过或达到预期的标准或目标;失败后跳转
FAILED_RESULT:
    Py_DECREF(pValue);
FAILED_VALUE:
    Py_DECREF(pFunc);
FAILED_FUNC:
    Py_DECREF(pModule);
FAILED_MODULE:

    return category;
}
  • 头文件也不能少
//garbage.h
#ifndef __GARBAGE__H
#define __GARBAGE__H
void garbage_init(void);//第一步做初始化,初始python的编译器包括导入当前路劲到sys.path里面
void garbage_final(void);
char *garbage_category(char *category);

#endif

2.3 测试代码

  • 我们来测试一下,先准备一张垃圾的图片
  • test2.c
    在这里插入图片描述
//garbagetest.c
#include <stdio.h>
#include <stdlib.h>
#include "garbage.h"

int main(int argc, char *argv[])
{
    char *category = NULL;
    garbage_init(); // 第一步做初始化,初始python的编译器包括导入当前 路劲到sys.path里面
    category = garbage_category(category);  
    // printf("category = %s\n",category);
    garbage_final();

    if(category)
        free(category);
    return 0;
}

3、实验结果

>>> gcc -o garbagetest garbagetest.c garbage.c garbage.h -I /usr/include/python3.10/ -l python3.10
>>> ./garbagetest

在这里插入图片描述



欢迎大家一起交流讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/492279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】从C到C++、从面向过程到面向对象(类与对象)

文章目录 C入门知识C与C的关系1. 类的引入&#xff1a;从结构体到类2. 类的声明和定义3. 类的作用域4. 类的访问限定符5. 面向对象特性之一&#xff1a;封装6. 类的实例化&#xff1a;对象7. 计算类对象的内存大小8. 成员函数中暗藏的this指针9. 类的六个默认生成的成员函数9.1…

NVIDIA 发布 Project GR00T 人形机器人基础模型和 Isaac 机器人平台重大更新

系列文章目录 前言 Isaac 机器人平台现可为开发者提供全新的机器人训练仿真器、Jetson Thor 机器人计算机、生成式 AI 基础模型和由 CUDA 加速的感知和操作库。 Project GR00T 是一种多模态人形机器人通用基础模型&#xff0c;作为机器人的大脑&#xff0c;使它们能够学习技能…

【Redis安装】Ubuntu下Redis编译安装

Redis编译安装 文档说明 本文作者:SwBack 创作时间:2024/3/26 17:19:19 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/qq_30817059 百度搜索: SwBack系统: Ubuntu redis: 2.8.17 下载redis源代码,并进行解压 wget http://download.redis.io/re…

百人一岗,Android开发者的困境。。。。。

前言 在当前的Android开发领域&#xff0c;竞争的激烈程度已经达到了前所未有的水平&#xff0c;几乎到了100个开发者竞争1个岗位的地步。 这种“内卷”现象的背后&#xff0c;是技术的快速发展和市场对Android开发者技能要求的不断提升。随着移动应用的普及和多样化&#xf…

SV-7041VP SIP塑料壳sip音箱支持POE供电(白色弧形)

SV-7041VP SIP塑料壳sip音箱支持POE供电 &#xff08;白色弧形&#xff09; 一、描述18123651365微信 SV-7041VP是深圳锐科达电子有限公司的一款壁挂式SIP网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可…

day11-数据统计(图形报表)

1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 常见效果展示&a…

如何本地部署开源AI知识库 FastGPT(新手教程)

环境: Win10 WSL2 ubuntu22.04 问题描述: 如何本地部署开源AI知识库 FastGPT 解决方案: 一、安装docker和docker-compose 安装docker 1.apt install docker.io2.apt install docker-compose3.docker --version4.docker compose version

基于nodejs+vue学生信息管理系统python-flask-django-php

本论文对学生信息管理系统的需求分析、功能设计、系统设计进行了详细的阐述&#xff0c;并对系统的总体设计进行了阐述&#xff0c;并对各功能的实现和主要功能进行了说明&#xff0c;并附上了相应的操作界面图。 前端技术&#xff1a;nodejsvueelementui, Express 框架于Node运…

2.9 Python缩进规则(包含快捷键)

Python缩进规则&#xff08;包含快捷键&#xff09; 和其它程序设计语言&#xff08;如 Java、C 语言&#xff09;采用大括号“{}”分隔代码块不同&#xff0c;Python采用代码缩进和冒号&#xff08; : &#xff09;来区分代码块之间的层次。 在 Python 中&#xff0c;对于类…

JVM垃圾收集——相关算法

文章目录 1、对象存活判断1.1、引用计数算法1.2、可达性分析算法 2、GC Roots集合2.1、GC Roots2.2、MAT追踪GC Roots的溯源2.3、JProfiler追踪GC Roots的溯源 3、对象的finalization机制4、清除垃圾对象4.1、标记–清除算法4.2、复制算法4.3、标记–压缩算法 5、垃圾收集算法的…

Altium Designer的差分对布线走线技巧及规则设置

AD的PCB页面是有差分对布线的工具的&#xff0c;这种工具的使用首先需要自己添加差分对&#xff0c;才能进行交互式差分对布线&#xff1a; 在原理图中放置差分对标识&#xff0c;其中差分对要以_P和_N结尾来命名&#xff1a; 在原理图中放置差分对&#xff1a; 差分对在PCB中的…

Java编程练习之类的多态

类的多态可以从两方面体现&#xff1a;一是方法的重载&#xff0c;二是类的上下转型。 1&#xff09;方法的重载 方法的重载就是在同一个类中允许同时存在多个同名方法&#xff0c;只要这些方法的参数个数或类型不同即可。 练习1&#xff1a; 使用方法的重载描述所有的超市…

最小割问题合集,最大权闭合图,最大密度子图,最小权点覆盖,最大权独立子图,OJ练习,代码详解

文章目录 零、回顾1、流网络的割2、最小割问题 一、最小割的应用1.1POJ1966 -- Cable TV Network1.1.1原题链接1.1.2思路分析1.1.3AC代码 1.2ZOJ 2676 Network Wars1.2.1原题链接1.2.2思路分析1.2.3AC代码 1.3OPTM - Optimal Marks1.3.1原题链接1.3.2思路分析1.3.3AC代码 二、最…

【网站项目】305银行账目账户管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

对称加密算法的原理和优缺点

对称加密算法是现代信息安全领域中的一项核心技术&#xff0c;它通过使用相同的密钥进行数据的加密和解密操作&#xff0c;确保了信息在传输过程中的安全性和保密性。在这篇文章中&#xff0c;我们将对对称加密算法的基本原理、常见类型、应用场景以及优缺点进行详细的探讨。 基…

[Linux]条件变量:实现线程同步(什么是条件变量、为什么需要条件变量,怎么使用条件变量(接口)、例子,代码演示(生产者消费者模型))

目录 一、条件变量 1.什么是条件变量 故事说明 2、为什么需要使用条件变量 竞态条件 3.什么是同步 饥饿问题 二、条件变量的接口 1.pthread_cond_t 2.初始化&#xff08;pthread_cond_init&#xff09; 3.销毁&#xff08;pthread_cond_destroy&#xff09; 4.等待…

【JSON2WEB】11 基于 Amis 角色功能权限设置页面

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

网安小白入门课程/ Web渗透0基础就业班

想从事渗透相关工作&#xff0c;却不知从何学起&#xff1f;网上自学资料又旧又乱&#xff0c; 学起来时间周期长、效果差&#xff1f;到底学到什么程度才能找到工作&#xff1f; 知识又杂又乱&#xff0c;花了不少时间学习出来却很难成体系&#xff1f; 独自学习枯燥无味&a…

HomeLink项目部署和发布的完整流程

由于Java项目的配置较为繁琐&#xff0c;长时间不使用可能会忘记&#xff0c;因此我特意总结了一下配置流程。 1.软件环境: myeclipse-10.7.1-offline-installer-windows(直接安装) apache-tomcat-7.0.65-windows-x64(Tomcat下载安装以及配置-CSDN博客) JDK(Myeclipse自带…

openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint

文章目录 openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint252.1 功能描述252.2 语法格式252.3 参数说明252.4 示例 openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint 252.1 功能描述 指明scan使用的方法&#…