Python 异步: 在非阻塞子进程中运行命令(19)
动动发财的小手,点个赞吧!
我们可以从 asyncio 执行命令。该命令将在我们可以使用非阻塞 I/O 写入和读取的子进程中运行。
1. 什么是 asyncio.subprocess.Process
asyncio.subprocess.Process 类提供了由 asyncio 运行的子进程的表示。它在 asyncio 程序中提供子进程的句柄,允许对其执行操作,例如等待和终止它。
该 API 与 multiprocessing.Process 类非常相似,可能与 subprocess.Popen 类更相似。具体来说,它与 subprocess.Popen 共享 wait()、communicate() 和 send_signal() 等方法以及 stdin、stdout 和 stderr 等属性。
现在我们知道了 asyncio.subprocess.Process 类是什么,让我们看看如何在我们的 asyncio 程序中使用它。
我们不直接创建 asyncio.subprocess.Process。相反,在 asyncio 程序中执行子进程时,会为我们创建一个类的实例。
有两种方法可以将外部程序作为子流程执行并获取 Process 实例,它们是:
asyncio.create_subprocess_exec() 用于直接运行命令。 asyncio.create_subprocess_shell() 用于通过 shell 运行命令。
让我们依次看一下每个示例。
2. 如何直接运行命令
命令是在命令行(终端或命令提示符)上执行的程序。这是另一个直接运行的程序。
Linux 和 macOS 上的常见示例可能是:
‘ls’ 列出目录的内容 ‘cat’报告文件的内容 “data”报告日期 ‘echo’ 报告一个字符串 ‘sleep’ 睡眠几秒钟
我们可以通过 create_subprocess_exec() 函数从 asyncio 程序执行命令。
asyncio.create_subprocess_exec() 函数接受一个命令并直接执行它。
这很有用,因为它允许命令在子进程中执行,并允许 asyncio 协程读取、写入和等待它。
与 asyncio.create_subprocess_shell() 函数不同,asyncio.create_subprocess_exec() 不会使用 shell 执行命令。
这意味着 shell 提供的功能,例如 shell 变量、脚本和通配符,在执行命令时不可用。
这也意味着执行命令可能更安全,因为没有机会进行 shell 注入。
现在我们知道了 asyncio.create_subprocess_exec() 的作用,让我们看看如何使用它。
2.1. 如何使用 Asyncio create_subprocess_exec()
asyncio.create_subprocess_exec() 函数将在子进程中执行给定的字符串命令。
它返回一个代表子进程的 asyncio.subprocess.Process 对象。
create_subprocess_exec() 函数是一个协程,这意味着我们必须等待它。它会在子流程启动后返回,而不是在子流程完成时返回。
...
# execute a command in a subprocess
process = await asyncio.create_subprocess_exec('ls')
正在执行的命令的参数必须作为后续参数提供给 create_subprocess_exec() 函数。
...
# execute a command with arguments in a subprocess
process = await asyncio.create_subprocess_exec('ls', '-l')
我们可以通过等待 wait() 方法来等待子进程完成。
...
# wait for the subprocess to terminate
await process.wait()
我们可以通过调用 terminate() 或 kill() 方法直接停止子进程,这将在子进程中引发一个信号。
...
# terminate the subprocess
process.terminate()
命令的输入和输出将由 stdin、stderr 和 stdout 处理。我们可以让 asyncio 程序处理子进程的输入或输出。
这可以通过指定输入或输出流并指定要重定向的常量来实现,例如 asyncio.subprocess.PIPE。
例如,我们可以将命令的输出重定向到 asyncio 程序:
...
# start a subprocess and redirect output
process = await asyncio.create_subprocess_exec('ls', stdout=asyncio.subprocess.PIPE)
然后我们可以通过 asyncio.subprocess.Process 实例通过 communicate() 方法读取程序的输出。
此方法是协程,必须等待。它用于通过子流程发送和接收数据。
...
# read data from the subprocess
line = process.communicate()
我们还可以通过以字节为单位设置“input”参数,通过 communicate() 方法将数据发送到子进程。
...
# start a subprocess and redirect input
process = await asyncio.create_subprocess_exec('ls', stdin=asyncio.subprocess.PIPE)
# send data to the subprocess
process.communicate(input=b'Hello\n')
在后台,asyncio.subprocess.PIPE 将子进程配置为指向 StreamReader 或 StreamWriter,用于向子进程发送数据或从子进程发送数据,并且 communicate() 方法将从配置的读取器读取或写入字节。
我们可以通过子进程通过 stdin、stdout 和 stderr 属性直接与 StreamReader 或 StreamWriter 交互。
...
# read a line from the subprocess output stream
line = await process.stdout.readline()
现在我们知道如何使用 create_subprocess_exec() 函数,让我们看一些工作示例。
2.2. Asyncio create_subprocess_exec() 示例
我们可以探索如何在 asyncio 的子进程中运行命令。在这个例子中,我们将执行“echo”命令来报告一个字符串。
echo 命令将直接在标准输出上报告提供的字符串。下面列出了完整的示例。
请注意,此示例假设您可以访问“echo”命令,我不确定它是否适用于 Windows。
# SuperFastPython.com
# example of executing a command as a subprocess with asyncio
import asyncio
# main coroutine
async def main():
# start executing a command in a subprocess
process = await asyncio.create_subprocess_exec('echo', 'Hello World')
# report the details of the subprocess
print(f'subprocess: {process}')
# entry point
asyncio.run(main())
运行示例首先创建 main() 协程并将其作为 asyncio 程序的入口点执行。
main() 协程运行并调用 create_subprocess_exec() 函数来执行命令。
main() 协程在创建子进程时挂起。返回一个 Process 实例。
main() 协程恢复并报告子进程的详细信息。 main() 进程终止,asyncio 程序终止。
echo 命令的输出在命令行上报告。这突出了我们如何从 asyncio 程序执行命令。
Hello World
subprocess: <Process 50249>
3. 如何通过 Shell 运行命令
我们可以使用 shell 执行命令。shell 是命令行的用户界面,称为命令行解释器 (CLI)。它将代表用户解释和执行命令。
它还提供诸如用于脚本、通配符、管道、shell 变量(例如 PATH)等的原始编程语言等功能。
例如,我们可以将一条命令的输出重定向为另一条命令的输入,比如将“/etc/services”文件的内容重定向到word count命令“wc”中,统计行数:
cat /etc/services | wc -l
基于 Unix 的操作系统中的 shell 示例包括:

shell 已经在运行,它被用来启动 Python 程序。您无需执行任何特殊操作即可获取或访问 shell。
我们可以通过 create_subprocess_shell() 函数从 asyncio 程序执行命令。
asyncio.create_subprocess_shell() 函数接受一个命令并使用当前用户 shell 执行它。
这很有用,因为它不仅允许执行命令,还允许使用 shell 的功能,例如重定向、通配符等。
该命令将在执行 asyncio 程序的进程的子进程中执行。重要的是,asyncio 程序能够与子进程异步交互,例如通过协程。
通过 shell 而不是直接执行命令时,可能会有安全考虑。
这是因为请求执行命令和正在执行的命令之间至少存在一层间接和解释,允许可能的恶意注入。
现在我们知道了 asyncio.create_subprocess_shell() 的作用,让我们看看如何使用它。
3.1. 如何使用 Asyncio create_subprocess_shell()
asyncio.create_subprocess_shell() 函数将通过当前 shell 执行给定的字符串命令。
它返回一个表示进程的 asyncio.subprocess.Process 对象。
它与我们在上一节中看到的 create_subprocess_shell() 函数非常相似。不过,我们将回顾如何使用该函数以及如何通过 Process 实例与流程交互(以防您直接跳到本节)。
create_subprocess_shell() 函数是一个协程,这意味着我们必须等待它。它会在子流程启动后返回,而不是在子流程完成时返回。
...
# start a subprocess
process = await asyncio.create_subprocess_shell('ls')
我们可以通过等待 wait() 方法来等待子进程完成。
...
# wait for the subprocess to terminate
await process.wait()
我们可以通过调用 terminate() 或 kill() 方法直接停止子进程,这将在子进程中引发一个信号。
命令的输入和输出将由 shell 处理,例如标准输入、标准错误和标准输出。
我们可以让 asyncio 程序处理子进程的输入或输出。
这可以通过指定输入或输出流并指定要重定向的常量来实现,例如 asyncio.subprocess.PIPE。
例如,我们可以将命令的输出重定向到 asyncio 程序:
...
# start a subprocess and redirect output
process = await asyncio.create_subprocess_shell('ls', stdout=asyncio.subprocess.PIPE)
然后我们可以通过 asyncio.subprocess.Process 实例通过 communicate() 方法读取程序的输出。
此方法是协程,必须等待。它用于通过子流程发送和接收数据。
...
# read data from the subprocess
line = process.communicate()
我们还可以通过以字节为单位设置“input”参数,通过 communicate() 方法将数据发送到子进程。
...
# start a subprocess and redirect input
process = await asyncio.create_subprocess_shell('ls', stdin=asyncio.subprocess.PIPE)
# send data to the subprocess
process.communicate(input=b'Hello\n')
在后台,asyncio.subprocess.PIPE 将子进程配置为指向 StreamReader 或 StreamWriter,用于向子进程发送数据或从子进程发送数据,并且 communicate() 方法将从配置的读取器读取或写入字节。
我们可以通过子进程通过 stdin、stdout 和 stderr 属性直接与 StreamReader 或 StreamWriter 交互。
...
# read a line from the subprocess output stream
line = await process.stdout.readline()
现在我们知道如何使用 create_subprocess_shell() 函数,让我们看一些工作示例。
3.2. Asyncio create_subprocess_shell() 示例
我们可以探索如何使用 shell 在 asyncio 的子进程中运行命令。在这个例子中,我们将执行“echo”命令来报告一个字符串。
echo 命令将直接在标准输出上报告提供的字符串。下面列出了完整的示例。
请注意,此示例假设您可以访问“echo”命令,我不确定它是否适用于 Windows。
# SuperFastPython.com
# example of executing a shell command as a subprocess with asyncio
import asyncio
# main coroutine
async def main():
# start executing a shell command in a subprocess
process = await asyncio.create_subprocess_shell('echo Hello World')
# report the details of the subprocess
print(f'subprocess: {process}')
# entry point
asyncio.run(main())
运行示例首先创建 main() 协程并将其作为 asyncio 程序的入口点执行。main() 协程运行并调用 create_subprocess_shell() 函数来执行命令。
main() 协程运行并调用 create_subprocess_shell() 函数来执行命令。main() 协程恢复并报告子进程的详细信息。 main() 进程终止,asyncio 程序终止。
echo 命令的输出在命令行上报告。这突出显示了我们如何使用 shell 从 asyncio 程序执行命令。
subprocess: <Process 43916>
Hello World
本文由 mdnice 多平台发布
相关文章:
Python 异步: 在非阻塞子进程中运行命令(19)
动动发财的小手,点个赞吧! 我们可以从 asyncio 执行命令。该命令将在我们可以使用非阻塞 I/O 写入和读取的子进程中运行。 1. 什么是 asyncio.subprocess.Process asyncio.subprocess.Process 类提供了由 asyncio 运行的子进程的表示。它在 asyncio 程序…...
蓝桥杯嵌入式第五课--输入捕获
前言输入捕获的考题十分明确,就是测量输入脉冲波形的占空比和频率,对我们的板子而言,就是检测板载的两个信号发生器产生的信号:具体来说就是使用PA15和PB4来做输入捕获。输入捕获原理简介输入捕获能够对输入信号的上升沿和下降沿进…...
Spring事务和事务传播机制
目录 Spring中事务的实现 1、通过代码的方式手动实现事务 2、通过注解的方式实现声明式事务 2.1、Transactional作用范围 2.2、Transactional参数说明 2.3、注意事项 2.4、Transactional工作原理 事务隔离级别 1、事务特性 2、Spring中设置事务隔离级别 2.1、MySQL事…...
基于OpenCV+CUDA实时视频抠绿、背景合成以及抠绿算法小结
一、关于抠绿 百度百科上描述抠绿“抠绿是指在摄影或摄像时,以绿色为背景进行拍摄,在后期制作时使用特技机的“色键”将绿色背景抠去,改换其他更理想的背景的技术。”绿幕的使用已经非常普遍,大到好莱坞大片,小到自媒体的节目,一些商业娱乐场景,几乎都用使用。但是很多非…...
MySQL 中的 UNION 语句
文章目录一、数据准备一、UNION 和 UNION ALL二、UNION 的执行顺序(UNION 和其他语句一同出现)三、MySQL 使用 UNION(ALL) ORDER 导致排序失效四、UNION 报错语法一、数据准备 -- 创建表 CREATE TABLE test_user (ID int(11) NO…...
高完整性系统工程(三): Logic Intro Formal Specification
目录 1. Propositions 命题 2.1 Propositional Connectives 命题连接词 2.2 Variables 变量 2.3 Sets 2.3.1 Set Operations 2.4 Predicates 2.5 Quantification 量化 2.6 Relations 2.6.1 What Is A Relation? 2.6.2 Relations as Sets 2.6.3 Binary Relations as…...
【linux】多线程概念详述
文章目录一、线程基本概念1.1 进程地址空间与页表1.2 页表结构1.3 线程的理解1.3.1 如何描述线程1.4 再谈进程1.5 代码理解1.5.1 原生库提供线程pthread_create1.6 资源共享问题1.7 资源私有问题二、总结2.1 什么是线程2.2 并行与并发2.3 线程的优点2.4 线程的缺点2.5 线程异常…...
【Java】P8 面向对象(3)方法 基本知识
面向对象 方法方法方法的声明权限修饰符返回值类型方法名形参列表方法体简单案例方法 方法 是对类或对象行为特征的抽象,用来完成某个功能的操作。方法的目的 是为了实现代码复用,减少冗余,简化代码;方法不能独立存在,…...
js中null和undefined的区别
js中null和undefined的区别?这也是一个常见的js面试题 相同点 1,都是基本类型。 2,做判断值都是false。 !!null false // true !!undefined false // true不同点 1,诞生时间null在前,undefined在后。因为js作者Brendan-Eic…...
【Linux】linux中的c++怎么调试?gdb的介绍和使用。
背景1.1.前提知识程序的发布方式有两种,debug模式和release模式Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项windows上的调试方法有区别吗?1.调试思路是一样的2…...
提升Python代码性能的六个技巧
文章目录前言为什么要写本文?1、代码性能检测1.1、使用 timeit 库1.2、使用 memory_profiler 库1.3、使用 line_profiler 库2、使用内置函数和库3、使用内插字符串 f-string4、使用列表推导式5、使用 lru_cache 装饰器缓存数据6、针对循环结构的优化7、选择合适算法…...
VI的常用命令
VI的常用命令 文章目录VI的常用命令vi/vim是什么?VI普通模式命令VI编辑模式命令VI指令模式vi/vim是什么? VI是Unix操作系统和类Unix操作系统中最通用的文本编辑器 VIM编辑器是从VI发展出来的一个性能更强大的文本编辑器。可以主动的将字体颜色辨别语法…...
【数据结构】万字深入浅出讲解单链表(附原码 | 超详解)
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:C语言实现数据结构 💬总结:希望你看完…...
无线WiFi安全渗透与攻防(五)之aircrack-ng破解WEP加密
系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 无线WiFi安全渗透与攻防(二)之打造专属字典 无线WiFi安全渗透与攻防(三)之Windows扫描wifi和破解WiFi密码 无线WiFi安全渗透与攻防(四)之kismet的使用 aircrack-ng破解WEP加密 1.WEP介绍 其实我们平常在使用wifi的时…...
MySQL中事务的相关问题
事务 一、事务的概述: 1、事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit…...
推荐算法再次踩坑记录
去年搞通了EasyRec这个玩意,没想到今年还要用推荐方面的东西,行吧,再来一次,再次踩坑试试。1、EasyRec训练测试数据下载:git clone后,进入EasyRec,然后执行:bash scripts/init.sh 将…...
STM32 (十五)MPU6050
简介前言一、MPU6050简介MPU6050是一款性价比很高的陀螺仪,可以读取X Y Z 三轴角度,X Y Z 三轴加速度,还有内置的温度传感器,在姿态解析方面应用非常广泛。下面是它在淘宝上的参数图产品尺寸产品参数产品原理图:二、硬…...
使用yarn,依赖报各种错误怎么办
使用 yarn^3.x 版本时,默认并不会安装包到 node_modules,因为 yarn3.x 是即插即用的,也就是说如果你下载过这个包,yarn只会生成一个 Png文件,然后将包的路径 link 到下载过的地方,这样可以省去很多时间。而…...
面试官:rem和vw有什么区别
"rem" 和 "vw"的区别 "rem" 和 "vw" 都是用于网页设计的CSS单位。 "rem" 是相对于根元素的字体大小来计算的单位,即相对于 "html" 标签的字体大小。例如,如果 "html" 标签的字…...
【GPT-4】GPT-4 相关内容总结
目录 编辑 官网介绍 GPT-4 内容提升总结 GPT-4 简短版总结 GPT-4 基础能力 GPT-4 图像处理 GPT-4 技术报告 训练过程 局限性 GPT-4 风险和应对措施 开源项目:OpenAI Evals 申请 GPT-4 API API的介绍以及获取 官网介绍 官网:GPT-4 API候…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
