为什么说Python 是胶水语言?

news2024/11/26 7:53:18

​ "Python 是胶水语言"这一说法是指它很擅长将不同的程序或代码库连接在一起,能够让来自不同编程语言或框架的组件无缝协作。Python 具有丰富的库和简单的语法,使得它可以轻松调用其他语言编写的程序或使用不同技术栈的模块。

​ 以下是几个具体的实例,展示了Python 作为胶水语言的特性:

实例 1:调用 C/C++ 代码

​ 使用ctypes 库可以方便地调用 C 函数。
假设有一个简单的 C 函数:

// example.c
#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

void say_hello() {
    printf("Hello, World!\n");
}

采用编译它为共享库:

gcc -shared -o libexample.so -fPIC example.c

然后用 Python 调用这个库:

# example.py
import ctypes

# 加载共享库
lib = ctypes.CDLL('./libexample.so')

# 定义函数原型
lib.add.argtypes = (ctypes.c_int, ctypes.c_int) # 表示该函数接收两个整数参数
lib.add.restype = ctypes.c_int # 设置 `add` 函数的返回类型

# 调用 C 函数
result = lib.add(3, 5)
print(f'Result of add(3, 5): {result}')

# 调用无参数 C 函数
lib.say_hello()

运行这个 Python 脚本,你会看到:

在这里插入图片描述

实例 2:集成数据库和 Web 服务

​ Python 强大的库生态,使得它在集成不同技术栈方面非常有优势。例如,连接一个数据库并通过 Flask 框架提供一个简单的 Web API。

# Install required packages:
# pip install flask sqlalchemy

from flask import Flask, jsonify, request
from sqlalchemy import create_engine, Column, Integer, String, Sequence
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

app = Flask(__name__)
Base = declarative_base()

# 创建数据库表 User(id, name, age)
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    age = Column(Integer)

# 使用的是 SQLite 文件数据库,数据存储到本地文件中,程序结束后数据也会被保留

engine = create_engine('sqlite:///mydatabase.db')  # 使用文件存储的 SQLite 数据库
Base.metadata.create_all(engine)  # 创建所有的表

Session = sessionmaker(bind=engine)  # 这个Session对象实际上是一个数据库会话或连接,它用于执行数据库操作(如查询、插入、更新、删除等)。
session = Session()

# 添加一些数据
new_user = User(name='Bobo', age=52)
session.add(new_user)
session.commit()

@app.route('/users', methods=['GET'])
def get_users():
    users = session.query(User).all()
    return jsonify([{'id': user.id, 'name': user.name, 'age': user.age} for user in users])

@app.route('/user', methods=['POST'])
def add_user():
    data = request.json
    new_user = User(name=data['name'], age=data['age'])
    session.add(new_user)
    session.commit()
    return jsonify({'id': new_user.id})

if __name__ == '__main__':
    app.run(debug=True)

​ 这个脚本使用 SQLAlchemy连接 SQLite 数据库,并且通过 Flask 框架提供了一个 Web 接口。运行这个脚本并访问 http://127.0.0.1:5000/users 获取表中记录信息。

​ 使用 http://127.0.0.1:5000/user,访问在本程序中会出现如下错误,出现如下 Method Not Allowed。 错误的原因是因为 HTTP 方法错误。访问 URL http://127.0.0.1:5000/user 时,浏览器默认使用 GET 方法请求,而代码中,/user 端点只允许 POST 方法。
在这里插入图片描述

我们可以使用cURL来发送POST请求:

结合之前的 Flask 示例,我们可以使用 cURL 向我们的 Flask 应用发送一个 POST 请求来添加用户:

在 Git Bash
curl -X POST -H "Content-Type: application/json" -d '{"name": "Bo", "age": 30}' http://127.0.0.1:5000/user

在 Windows 命令提示符(CMD)或 PowerShell
curl -X POST -H "Content-Type: application/json" -d "{\"name\": \"Bobo\", \"age\": 30}" http://127.0.0.1:5000/user

注意:
1. 双引号问题:在 Windows CMD 中,双引号会被用来包裹整个字符串,内部的双引号需要进行转义。 
2. 单引号和双引号的区别:在 Unix 风格的 Shell(如 Git Bash)中,你可以使用单引号包裹整个字符串,JSON 字符串内部的引号不需要转义。

建议用Git Bash来测试

​ 第二个实例展示了如何利用Python作为胶水语言,将不同的技术和组件集成在一起进行协作。具体来说,它通过几个方面体现了Python的胶水作用:

1. 数据库连接与操作

​ 在该实例中,使用了SQLAlchemy库与SQLite数据库进行连接和操作。SQLAlchemy是Python中一个非常强大的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。

代码片段:

from flask import Flask, jsonify, request
from sqlalchemy import create_engine, Column, Integer, String, Sequence
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

app = Flask(__name__)
Base = declarative_base()

# 创建数据库表 User(id, name, age)
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    age = Column(Integer)

# 使用的是 SQLite 文件数据库,数据存储到本地文件中,程序结束后数据也会被保留

engine = create_engine('sqlite:///mydatabase.db')  # 使用文件存储的 SQLite 数据库
Base.metadata.create_all(engine)  # 创建所有的表

Session = sessionmaker(bind=engine)  # 这个Session对象实际上是一个数据库会话或连接,它用于执行数据库操作(如查询、插入、更新、删除等)。
session = Session()

# 添加一些数据
new_user = User(name='Bobo', age=52)
session.add(new_user)
session.commit()
2. 提供Web服务

​ 实例中使用了Flask框架来提供Web服务。Flask是一个轻量级的Web应用框架,适合快速开发和部署Web应用。通过Flask框架,可以轻松定义API端点,并处理HTTP请求和响应。

代码片段:

@app.route('/users', methods=['GET'])
def get_users():
    users = session.query(User).all()
    return jsonify([{'id': user.id, 'name': user.name, 'age': user.age} for user in users])

@app.route('/user', methods=['POST'])
def add_user():
    data = request.json
    new_user = User(name=data['name'], age=data['age'])
    session.add(new_user)
    session.commit()
    return jsonify({'id': new_user.id})

if __name__ == '__main__':
    app.run(debug=True)
3. 数据格式转换

​ 通过jsonify函数,实例实现了将Python对象(如列表和字典)转换为JSON格式的HTTP响应。这体现了Python在数据格式转换和处理方面的灵活性。

代码片段:

from flask import jsonify

@app.route('/users', methods=['GET'])
def get_users():
    users = session.query(User).all()
    return jsonify([{'id': user.id, 'name': user.name, 'age': user.age} for user in users])
4. 跨模块和库的协作

​ 该实例展示了如何将不同功能的库和模块结合在一起工作。比如,Flask负责处理Web请求和响应,而SQLAlchemy负责数据库操作。Python通过其简单的语法和强大的库生态,使得整合这些组件变得非常方便和高效。

5. 使用第三方库

SQLAlchemy和 Flask 都是Python的第三方库,Python的胶水功能在这里表现为它能够无缝地集成和使用这些库以实现复杂的功能,而不需要开发者编写大量的底层代码。

​ 综上所述,这个实例在数据库连接与操作、提供Web服务、数据格式转换、不同模块和库的协作以及第三方库的使用方面,展示了Python作为胶水语言将各种不同技术和组件整合起来的强大能力。

实例 3:控制和管理系统进程

​ 通过 Python 提供的 subprocess 库,你可以轻松地调用和管理系统进程。

import subprocess

# 运行一个简单的系统命令适用于Windows平台
result = subprocess.run(['cmd', '/c', 'dir'], capture_output=True, text=True) # 使用cmd命令解释器,并通过 `/c` 参数执行 `dir` 命令。
print(result.stdout)

# 运行另一个 Python 脚本
result = subprocess.run(['python', 'other_script.py'], capture_output=True, text=True)
print(result.stdout)

​ 第三个实例展示了如何使用 Python 的 subprocess 模块来调用和管理系统级别的命令和其他 Python 脚本。这些功能在以下几个方面展示了 Python 作为胶水语言的能力:

1. 调用系统命令

​ Python 可以通过 subprocess 模块轻松地调用和执行系统命令。这使得 Python 能够扮演脚本语言的角色,用于自动化各种系统管理任务,与操作系统直接交互。

import subprocess

# 运行一个简单的系统命令适用于Windows平台
result = subprocess.run(['cmd', '/c', 'dir'], capture_output=True, text=True) # 使用cmd命令解释器,并通过 `/c` 参数执行 `dir` 命令。
print(result.stdout)

​ 在这个例子中,Python 调用系统自带的dir/c命令,列出当前目录下的文件并将结果输出。这展示了 Python 与操作系统之间的无缝集成。

2. 执行其他 Python 脚本

​ 除了系统命令,Python 还可以调用其他 Python 脚本,执行这些脚本并捕获其输出。这使得 Python 可以作为主调度器,将多个 Python 脚本整合到一个更大的应用程序或工作流程中。

# 运行另一个 Python 脚本
result = subprocess.run(['python', 'other_script.py'], capture_output=True, text=True)
print(result.stdout)

​ 这个例子展示了如何通过 Python 调用另一个 Python 脚本 other_script.py 并获取其输出。这在多脚本项目或分布式系统中尤其有用。

3. 捕获和处理外部命令的输出

​ 通过 capture_output=Truetext=True 参数,Python 可以捕获并直接处理外部命令的输出,便于后续的逻辑处理或数据分析。这使得 Python 可以整合外部工具的功能,将它们的输出纳入到整个应用程序的工作流程中。

# 运行一个简单的系统命令适用于Windows平台
result = subprocess.run(['cmd', '/c', 'dir'], capture_output=True, text=True)
print(result.stdout)

在这个例子中,Python 捕获了 ls -l 命令的输出,并将其作为字符串处理和打印。

4. 统一的错误处理机制

subprocess 模块还提供了统一的错误处理机制。当外部命令失败时,Python 可以捕获错误信息并进行相应的处理。这使得错误管理变得更加简单和一致。

try:
    result = subprocess.run(['some_non_existing_command'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print(f"Command failed with exit status {e.returncode}")
    print(e.output)

在这个例子中,如果外部命令失败,Python 可以捕获异常并处理错误信息,提供更好的错误管理能力。

5. 平台独立性

​ Python 的 subprocess 模块是跨平台的,这意味着同样的代码可以在不同操作系统上运行,而不需要做多余的修改。这极大地提高了代码的可移植性和维护性。

import subprocess

# 运行一个简单的系统命令 Linux下
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

无论是在 Linux、macOS 还是 Windows,这段代码都能够工作(在 Windows 上需要将 ls -l 换成相应的命令,例如 dir)。

6. 管道和数据流

subprocess 模块允许我们通过管道将不同进程的输入和输出连接起来,形成数据流。这使得 Python 可以将多个独立的程序组合起来,共同完成一个复杂任务。

# Example: Using pipeline
import subprocess
# 第一阶段:使用 echo 产生文本
# 我们使用 cmd 来调用 echo,因为 echo 是 cmd 的内置命令
cmd1 = ['cmd', '/c', 'echo Hello, World! This is a test.']
# 第二阶段:使用 findstr 查找特定单词
cmd2 = ['findstr', 'World']  # findstr 在 Windows 上用它来查找文本
# 运行第一个命令
result1 = subprocess.run(cmd1, stdout=subprocess.PIPE, text=True)
# 将第一个命令的输出作为输入传递给第二个命令
result2 = subprocess.run(cmd2, input=result1.stdout, capture_output=True, text=True)
# 打印第二个命令的输出
print("Filtered output:", result2.stdout)

​ 在这个实例中,使用了 Windows 平台下的 cmdfindstr 命令,演示了如何通过管道将一个命令的输出传递给另一个命令。这种方式在 Windows 平台上非常实用,可以有效地实现数据流处理和命令的组合使用。

​ 第三个实例通过调用系统命令、执行其他 Python 脚本、捕获和处理外部命令的输出、统一的错误处理机制、平台独立性以及管道和数据流的使用,充分展示了 Python 作为胶水语言的强大能力。它能够将不同的工具和组件无缝地集成到一个统一的工作流程中,提高开发效率和代码的可维护性。

小结

​ 从调用底层的高效 C/C++ 代码,到无缝集成数据库操作及 web 服务,再到进行复杂的系统级别命令管理和数据流处理,Python 出色地充当了“胶水”的角色,把各自独立的发展语言、工具和技术整合到一个统一的环境中。

  1. 与多种语言和技术的无缝整合: 不管是与 C/C++ 库交互,还是与数据库或 Web 服务的整合,Python 都能够轻松完成。

    丰富的库和框架支持SQLAlchemyFlaskctypessubprocess 等强大的三方库和框架让 Python 的集成功能变得平易近人。

  2. 简洁优雅的语法: 简单而清晰的语法使开发者能够迅速编写和调试代码,提高开发效率。

  3. 跨平台: Python 脚本在 Windows、macOS 和 Linux 环境下都能无缝运行,使其成为跨平台开发的理想选择。

​ 因此,Python 作为“胶水语言”不仅是在技术上的能力,更在于它通过简洁优雅的编程方式,将不同的技术轻松连接在一起,使开发者得以在复杂的技术栈中游刃有余。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCtoLCD2002 图片取模教程

记录一下取模软件&#xff0c;自己也是经常忘记怎么用&#xff0c;比较烦 按照下面这张图来就可以了&#xff0c;STM32的OLED屏幕可以直接用来显示图片。

可视化图表走起来(1):桑基图,一目了然数据流向。

从事可视化设计&#xff0c;什么时候选用什么样的图表非常重要&#xff0c;今天来介绍一下桑基图的定义、场景、数据项等等&#xff0c;贝格前端工场愿意与各位老铁一道成长。 一、桑基图的定义 桑基图&#xff08;Sankey diagram&#xff09;是一种特殊类型的可视化图表&…

数据结构-3、栈、队列和数组

3.1、栈 3.1.1、栈的基本概念&#xff1a; 1、栈的定义&#xff1a; ​ 栈是只允许在一端进行插入或删除操作的线性表。首先&#xff0c;栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作&#xff0c;如下图&#xff1a; ​ 栈顶&#xff08;Top&…

Zombie Animations Set

僵尸动画合集,包括成对攻击/抓取、各种移动方式、爬行、击中反应、死亡动画等。 生产说明 动画总数:99(包括22个位置变化) 配对动画:36 攻击次数:6次 爬网:9 命中反应:6 空转:14 行程2 跑步次数:9次 短跑:2 匝数:3 步行次数:12次 免责声明 任何游戏玩法蓝图都不包…

【电路笔记】-共集极放大器

共集极放大器 文章目录 共集极放大器1、概述2、等效电路3、电压增益4、偏置方法5、输入阻抗6、输出阻抗7、电流增益8、示例:共集电极放大器的电压、电流和功率增益9、达林顿对10、总结1、概述 本文介绍另一种用于放大信号的双极晶体管架构,通常称为共集电极放大器 (CCA)。 C…

深入解析Prometheus架构:打造高效监控系统的终极指南

1. Prometheus Server&#xff08;Prometheus服务器&#xff09; 技术原理&#xff1a; Retrieval&#xff08;检索模块&#xff09;&#xff1a;定期从配置的Targets&#xff08;目标&#xff09;拉取监控数据。使用HTTP协议&#xff0c;通过拉取的方式收集数据。TSDB&#…

如何通过抖音自动评论精准获客实现业务增长?这些方法值得一试!

在当今竞争激烈的商业环境中&#xff0c;企业若想脱颖而出&#xff0c;就必须掌握精准获客的艺术。精准获客&#xff0c;即通过精确的市场定位和营销策略&#xff0c;吸引并保留最有可能成为客户的目标群体。它不仅能提高转化率&#xff0c;还能有效降低营销成本&#xff0c;是…

【人工智能】开发AI可能获刑?加州1047草案详解

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其应用领域不断扩展&#xff0c;但同时也引发了诸多争议和监管问题。近期&#xff0c;加州参议院以32比1的压倒性投票通过了1047号草案&#xff0c;又称《前沿人工智能模型安全可靠创新法案》。这一草案…

Java---认识异常

欢迎大家来观看本博课------Java------认识异常。1.异常的概念和体系结构 1.异常的概念和体系结构 1.1 异常的概念 在Java中&#xff0c;在程序执行过程中发生的不正常行为称为异常。如在之前我们经常遇到的算数异常&#xff08;ArithmeticException&#xff09;、数组越界…

金融行业的等保测评要求

在金融行业中&#xff0c;网络安全问题非常普遍&#xff0c;如恶意攻击、病毒感染、数据泄露等。这些问题可能会导致金融机构的信息系统瘫痪&#xff0c;造成巨大的经济损失&#xff0c;甚至影响国家金融稳定。因此&#xff0c;金融机构应该高度重视网络安全问题&#xff0c;采…

使用libpurple函数库接入服务器

代码; #define CUSTOM_USER_DIRECTORY "/dev/null" // 定义用户目录 #define CUSTOM_PLUGIN_PATH "" // 定义插件目录 #define PLUGIN_SAVE_PREF "/purple/nullclient/plugins/saved" // 定义插件头目录 #define UI_ID "nullc…

DELL服务器插入新磁盘、创建虚拟磁盘、挂载磁盘步骤

文章目录 一、磁盘清理&#xff08;可选&#xff0c;针对新硬盘是Foreign状态&#xff09;1、进入VD Mgmt2、清理新硬盘配置 二、创建虚拟磁盘1、进入Device Settings2、创建虚拟磁盘 三、挂载磁盘到系统1、分区磁盘&#xff08;注意实际磁盘的名称&#xff09;2、格式化分区3、…

跨境电商中的IP隔离是什么?怎么做?

一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时&#xff0c;我们实际上是在讨论一种网络安全策略&#xff0c;旨在通过技术手段将网络划分为不同的区域或子网&#xff0c;每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…

微服务feign组件学习

手写不易&#xff0c;对您有帮助。麻烦一键三连。也欢饮各位大料指正&#xff0c;交流。 微服务feign组件学习 1.概念1.1 feign 概念1.2 Ribbon概念 2.使用2.1 集成feign2.1.1 maven依赖2.1.2 项目结构 2.2 使用2.2.1 定义feign接口2.2.2 消费端服务调用2.2.3 消费端扫描feig…

Java面试题汇总(持续更新.....)

Java面试题 1. JVM & JDK & JRE Java虚拟机&#xff08;JVM&#xff09;是运行Java字节码的虚拟机&#xff0c;JVM有针对不同系统的特定实现&#xff0c;目的是使用相同的字节码&#xff0c;他们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译、…

个人网站制作 Part 25 添加实时聊天功能 | Web开发项目添加页面缓存

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加实时聊天功能&#x1f528;使用聊天服务&#x1f527;步骤 1: 选择聊天服务&#x1f527;步骤 2: 安装Socket.io&#x1f527;步骤 3: 创建Socket.io服务器 &#x1…

抽奖系统源码_微信抽奖系统PHP源码开源

介绍&#xff1a; 微信抽奖系统源码是一个以php MySQL进行开发的手机抽奖系统源码。用途&#xff1a;适合做推广营销、直播、粉丝抽奖。 功能介绍&#xff1a; 1、后台可以设置每个抽奖用户的抽奖次数,后台添加设置奖品,适和企业和商场搞活动,后台添加用户&#xff0c;才能抽…

如何应对缺失值带来的分布变化?探索填充缺失值的最佳插补算法

本文将探讨了缺失值插补的不同方法&#xff0c;并比较了它们在复原数据真实分布方面的效果&#xff0c;处理插补是一个不确定性的问题&#xff0c;尤其是在样本量较小或数据复杂性高时的挑战&#xff0c;应选择能够适应数据分布变化并准确插补缺失值的方法。 我们假设存在一个…

【多线程】Thread类及其基本用法

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. Java中多线程编程1.1 操作系统线程与Java线程1.2 简单使用多线程1.2.1 初步创建新线程代码1.2.2 理解每个…

小功率无变压器电源设计

采用无变压器电源解决方案为低功率电路提供所需电源通常是有利的。 事实上&#xff0c;如果负载电流只有几十毫安&#xff0c;则可以将输入交流电压转换为直流电压&#xff0c;而无需使用大型、昂贵且笨重的变压器。不带变压器的替代方案也更便宜、更轻并且占地面积更小。无变…