Python的subprocess子进程和管道进行交互

Python 3 利用 subprocess 实现管道( pipe )交互操作读/写通信 阅读详情

目的是解决Python和C/C++的互操作性的问题,假如性能瓶颈的地方用C来写,而一些外围工作用Python来完成,岂不是完美的结合。

今天发现了更方便的方式,就是用subprocess模块,创建子进程,然后用管道来进行交互,而这种方式在shell中非常普遍,比如:cat xxx.file | test.py 就是用的管道,另外,在hadoop中stream模式就是用的管道。

其实在python中,和shell脚本,其他程序交互的方式有很多,比如:

os.system(cmd),os.system只是执行一个shell命令,不能输入、且无返回

os.open(cmd),可以交互,但是是一次性的,调用都少次都会创建和销毁多少次进程,性能太差

 

所以,建议用subprocess,但是subprocess复杂一些,可以参考python docs:

http://docs.python.org/library/subprocess.html

 

先看一个简单的例子,调用ls命令,两者之间是没有交互的:

[python]  view plain copy
  1. import subprocess  
  2. p = subprocess.Popen('ls')  
 

再看在程序中获取输出的例子:

[c-sharp]  view plain copy
  1. import subprocess  
  2. p = subprocess.Popen('ls',stdout=subprocess.PIPE)  
  3. print p.stdout.readlines()  
 

再看看有输入,有输出的例子,父进程发送'say hi',子进程输出 test say hi,父进程获取输出并打印

 

[python]  view plain copy
  1. #test1.py  
  2. import sys  
  3. line = sys.stdin.readline()  
  4. print 'test',line  
  5. #run.py  
  6. from subprocess import *  
  7. p =Popen('./test1.py',stdin=PIPE,stdout=PIPE)  
  8. p.stdin.write('say hi/n')  
  9. print p.stdout.readline()  
  10. #result  
  11. test say hi  
 

看看连续输入和输出的例子

test.py

[python]  view plain copy
  1. import sys  
  2. while True:  
  3.         line = sys.stdin.readline()  
  4.         if not line:break  
  5.         sys.stdout.write(line)  
  6.         sys.stdout.flush()  
 

run.py

[python]  view plain copy
  1. import sys  
  2. from subprocess import *  
  3. proc = Popen('./test.py',stdin=PIPE,stdout=PIPE,shell=True)  
  4. for line in sys.stdin:  
  5.         proc.stdin.write(line)  
  6.         proc.stdin.flush()  
  7.         output = proc.stdout.readline()  
  8.         sys.stdout.write(output)  
 

注意,run.py的flush和test.py中的flush,要记得清空缓冲区,否则程序得不到正确的输入和输出

 

C/C++的类似,伪代码如下

[cpp]  view plain copy
  1. char* line = new char[2048];  
  2. while (fgets(line, 2028, stdin)) {  
  3.     printf(line);  
  4.     fflush(stdout);//必须清空缓冲区  
  5. }  
 

 

Popen其他参数的设置,请参考python docs。


Python 3 利用 subprocess 实现管道交互操作读写通信 在上述代码中,我们首先使用 subprocess.Popen() 方法启动了一个子进程,该子进程执行了命令“ls -l”。我们将标准输出重定向到了一个管道中,以便我们可以在父进程中读取子进程的输出。在这段代码中,我们启动了一个 grep 子进程,该子进程将所有包含“foo”的行打印出来。我们向该子进程的标准输入中写入了一行“hello foo”,然后从子进程的标准输出中读取了数据,并打印了该数据。除了从子进程的标准输出中读取数据外,我们还可以向子进程的标准输入中写入数据。 阅读详情

相关推荐

基于IP2369与STM32的45W双向PD移动电源设计

USB PD(Power Delivery)是一种面向高功率、智能协商的通用快充协议,其核心在于通过BMC编码在CC线上完成供电能力(PDO)动态匹配与电压/电流精准调控。IP2369作为高度集成的PD协议管理芯片,内置PHY、协议引擎与MOSFET驱动,可卸载MCU实时通信压力;而STM32F103系列凭借低功耗STOP模式与丰富外设,成为电源状态管理与用户交互的理想协处理器。该组合显著提升系统鲁棒性与能效比,适用于便携式移动电源、嵌入式备用电源及PD协议教学验证等场景。本文围绕IP2369配置电阻精度、

weixin_42608299的博客 516

python调用pipe_python中的subprocess.PIPE上的非阻塞读取

fcntl,select,asyncproc在这种情况下无济于事。无论操作系统如何,无阻塞地读取流的可靠方法是使用Queue.get_nowait():import sysfrom subprocess import PIPE, Popenfrom threading import Threadtry:from queue import Queue, Emptyexcept ImportErro...

weixin_39955938的博客 1369

手把手教你理解瑞萨RH850芯片的HSM:从硬件隔离到软件中断通信

本文深入解析瑞萨RH850芯片的HSM架构,从硬件隔离到软件中断通信的完整实现。通过详细讲解HSM的硬件组件、启动流程、核间通信机制及安全服务实现,帮助开发者掌握芯片级安全技术,提升汽车电子和工业控制领域的安全防护能力。

weixin_33925615的博客 379

python子进程进行kinit认证_Python的subprocess子进程和管道进行交互

在很久以前,我写了一个系列,Python和C和C++的交互,如下目的是解决Python和C/C++的互操作性的问题,假如性能瓶颈的地方用C来写,而一些外围工作用Python来完成,岂不是完美的结合。今天发现了更方便的方式,就是用subprocess模块,创建子进程,然后用管道来进行交互,而这种方式在shell中非常普遍,比如:cat xxx.file | test.py就是用的管道,另外,在ha...

weixin_39601641的博客 200

通达信指标加密DLL加密解密三个公式源码准确率90%以上超级指标精准买卖绝世指标

通达信指标加密DLL加密解密三个公式源码准确率90%以上超级指标精准买卖绝世指标 1 超级指标 指标公式:买卖提示非常明显(适合通达信) 指标源码如下: M:3 100 60 N 3 100 30 散户线: 100*(HHV(HIGH,M)-CLOSE)/(HHV(HIGH,M)-LLV(LOW,M));RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100; K:=SMA(RSV,5,1); D:=SMA(K,3,1); J:=3*K-2*D;主力

m0_60244077的博客 3万+

基于MATLAB的井筒多相流模拟

井筒多相流的模拟可以基于不同的数学模型和计算方法。其中,最常用的模型之一是多相流模型,它基于质量守恒、动量守恒和能量守恒等原理,描述了流体在井筒中的流动行为。对于井筒多相流的模拟和分析可以帮助我们理解和优化油气田开发过程中的流体行为,从而提高产量和效率。在本文中,我们将介绍如何使用MATLAB进行井筒多相流的模拟,并提供相应的源代码。需要注意的是,以上示例是一个简化的模拟,仅用于演示如何使用MATLAB进行井筒多相流模拟。实际应用中,我们需要考虑更多的物理过程和参数,并使用更复杂的数值方法和模型进行模拟。

AtdiHtml的博客 706

现代全栈框架Amper技术评估:从核心能力到本地验证全流程

全栈开发框架通过整合前后端技术栈,提供统一的开发范式,旨在解决开发效率低下和技术栈碎片化问题。其核心原理在于利用模块热替换、类型安全和构建优化等技术,实现极速启动与流畅的开发体验。这类框架的技术价值在于显著提升开发者的生产力,通过端到端类型安全减少运行时错误,并优化生产构建性能。应用场景广泛,尤其适合启动新全栈Web项目、评估迁移现有技术栈,以及学习现代Web开发最佳实践。本文以Amper框架为例,结合热词“TypeScript”和“Vite”,构建了一套从环境准备、功能测试到性能观察的完整本地验证流程,为

weixin_30271335的博客 424

SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM

本文深入介绍了SAP中的用户确认对话框函数POPUP_TO_CONFIRM,包括其核心参数配置、返回值处理、应用场景和最佳实践。该函数是SAP二次开发中重要的交互工具,用于关键操作前获取用户确认,防止误操作。文章详细解析了参数设置技巧,强调必须全面处理所有可能的返回值,并提供了删除数据、批量操作等典型应用场景的代码示例。同时对比了其他类似弹出函数,帮助开发者选择合适工具。正确使用该函数可提升系统安全性、改善用户体验并符合SAP设计规范。

baidu_35680696的博客 970

python基础subprocess使用场景、主要功能、高级用法;创建新进程、连接到其输入/输出/错误管道并获取其返回代码

如果你需要执行多个命令,并希望将它们的输出通过管道连接起来,subprocess也能轻松处理。subprocess 可以处理进程间的标准输入输出流,允许你向外部进程发送数据,并获取其输出。返回一个进程对象,你可以通过它进行更多控制,例如获取输出、错误信息,或者向子进程发送输入。在这个示例中,p1命令列出了文件,而p2则通过管道过滤出了所有的.py文件。处理系统任务,执行外部程序,捕获命令输出,甚至进行错误处理和超时控制。启用一个进程并等待其完成,执行指定的命令,并返回执行的结果。会返回命令执行的退出码。

风华浪浪的博客 1432

内存越界一定会导致程序崩溃吗?详解内存越界

本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。

dvlinker的技术专栏 2万+

C#上位机+YOLO实时目标检测:摄像头采集+多线程推理+精度调优全流程

标注数据集:使用LabelImg工具标注目标对象,按YOLO格式整理数据集;模型训练:使用Ultralytics库训练自定义模型,提升特定目标的检测精度;训练参数优化:增加训练轮数(epochs=100200)、调整批次大小(batch=1632)、使用数据增强(flip、mosaic等)。摄像头采集:封装通用采集类,支持USB摄像头/网口相机,实现稳定帧读取与异常处理;多线程推理:采用“采集线程+推理线程+UI线程”解耦架构,使用线程安全队列传递帧数据,彻底解决界面卡顿;核心封装。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 673

zz: Python subprocess创建子进程(Windows下打开新的CMD窗口)

zz from: http://www.cnblogs.com/oubo/archive/2011/10/10/2394593.html Python subprocess 创建子进程 Python提供多个创建子进程的模块,我比较习惯使用subprocess模块,因为在Python手册中有这样一段话:   This module intends to

jtujtujtu的专栏 1万+

YOLOv11在RK3588芯片上的NPU加速与INT8量化部署全面指南

RK3588 NPU适配YOLOv11的关键技术要点 摘要:本文详细分析了Rockchip RK3588 NPU的硬件架构特性及其对YOLOv11模型的适配优化方案。RK3588 NPU采用三核设计,具备6TOPS算力,包含192个MAC单元和128KB专用SRAM。YOLOv11作为最新目标检测模型,其CSPNet-v5骨干网络、PANet特征金字塔和SiLU激活函数需要特殊适配处理。文章系统介绍了从PyTorch模型导出、ONNX优化到RKNN模型转换的完整流程,重点阐述了NPU不支持的算子处理方案和量

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1358

python 中 subprocess.Popen 总结

python 中 subprocess.Popen 总结 subprocess的目的就是启动一个新的进程并且与之通信。 subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下: subprocess.Popen(args, bufsize=0, executable=None, stdin=None,

weixin_45860565的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

pythonshell怎么查看模块_python模块----subprocess模块(shell命令模块)

当我们需要调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出,判断该命令的运行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完成我们需要的操作。subprocess模块允许一个进程创建一个新的子进程,通过管道连接到子进程的st...

weixin_39846378的博客 188

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python 管道 异步读取 stdout select_python调用外部子进程,通过管道实现异步标准输入和输出的...

我们通常会遇到这样的需求:通过C++或其他较底层的语言实现了一个复杂的功能模块,需要搭建一个基于Web的Demo,方法查询数据。由于Python语言的强大和简洁,其用来搭建Demo非常合适,Flask框架和jinja2模块功能为python提供了方便的web开发能力。同时,python能够很方便的同其他语言的代码交互。因此我们选择python作为开发Demo的工具。假设我们需要调用的模块(提供底层...

weixin_39907526的博客 217

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python创建子进程_Python subprocess 创建子进程

Python提供多个创建子进程的模块,我比较习惯使用subprocess模块,因为在Python手册中有这样一段话:This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*subproces...

weixin_39615219的博客 372

Python的“子进程魔法师”:`subprocess`模块深度解析

<摘要> 模块是Python中执行外部命令和进程的瑞士军刀,它取代了古老的和函数,提供了更强大、更安全的子进程管理能力。想象一下,Python程序是一位魔法师,而就是它召唤和控制其他程序的魔法咒语。本文将通过魔法学校的比喻,带你深入理解的工作原理:从简单的函数到强大的类,从标准输入输出重定向到进程间通信。我们将探索三个真实世界的应用场景:自动化部署脚本、实时日志监控系统和并行数据处理管道。无论你是想自动化日常任务,构建CI/CD流水线,还是创建复杂的多进程应用,掌握都将赋予你指挥外部程序的力量。<正文>在魔

weixin_42108533的博客 733
上一篇: Nmap高级用法与典型场景
下一篇: awk 使用帮助
Junfei-Yang
博客等级 码龄14年 3粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值