- 浏览: 615183 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
月光杯:
问题解决了吗?
Exceptions in HDFS -
iostreamin:
神,好厉害,这是我找到的唯一可以ac的Java代码,厉害。
[leetcode] word ladder II -
standalone:
One answer I agree with:引用Whene ...
How many string objects are created? -
DiaoCow:
不错!,一开始对这些确实容易犯迷糊
erlang中的冒号 分号 和 句号 -
standalone:
Exception in thread "main& ...
one java interview question
Module: subprocess
Purpose: Spawn and communicate with additional processes.
Python Version: New in 2.4
An updated version of this article can be found on the main PyMOTW site.
Description:
The subprocess module provides a consistent interface to creating and working with additional processes. It offers a higher-level interface than some of the other available modules, and is intended to replace functions such as os.system, os.spawn*, os.popen*, popen2.* and commands.*. To make it easier to compare subprocess with those other modules, this week I will re-create earlier examples using the functions being replaced.
The subprocess module defines one class, Popen() and a few wrapper functions which use that class. Popen() takes several arguments to make it easier to set up the new process, and then communicate with it via pipes. I will concentrate on example code here; for a complete description of the arguments, refer to section 17.1.1 of the library documentation.
A Note About Portability
The API is roughly the same, but the underlying implementation is slightly different between Unix and Windows. All of the examples shown here were tested on Mac OS X. Your mileage on a non-Unix OS will vary.
Running External Command
To run an external command without interacting with it, such as one would do with os.system(), Use the call() function.
import subprocess # Simple command subprocess.call('ls -l', shell=True)
$ python replace_os_system.py total 16 -rw-r--r-- 1 dhellman dhellman 0 Jul 1 11:29 __init__.py -rw-r--r-- 1 dhellman dhellman 1316 Jul 1 11:32 replace_os_system.py -rw-r--r-- 1 dhellman dhellman 1167 Jul 1 11:31 replace_os_system.py~
And since we set shell=True, shell variables in the command string are expanded:
# Command with shell expansion subprocess.call('ls -l $HOME', shell=True)
total 40 drwx------ 10 dhellman dhellman 340 Jun 30 18:45 Desktop drwxr-xr-x 15 dhellman dhellman 510 Jun 19 07:08 Devel drwx------ 29 dhellman dhellman 986 Jun 29 07:44 Documents drwxr-xr-x 44 dhellman dhellman 1496 Jun 29 09:51 DownloadedApps drwx------ 55 dhellman dhellman 1870 May 22 14:53 Library drwx------ 8 dhellman dhellman 272 Mar 4 2006 Movies drwx------ 11 dhellman dhellman 374 Jun 21 07:04 Music drwx------ 12 dhellman dhellman 408 Jul 1 01:00 Pictures drwxr-xr-x 5 dhellman dhellman 170 Oct 1 2006 Public drwxr-xr-x 15 dhellman dhellman 510 May 12 15:19 Sites drwxr-xr-x 5 dhellman dhellman 170 Oct 5 2005 cfx drwxr-xr-x 4 dhellman dhellman 136 Jan 23 2006 iPod -rw-r--r-- 1 dhellman dhellman 204 Jun 18 17:07 pgadmin.log drwxr-xr-x 3 dhellman dhellman 102 Apr 29 16:32 tmp
Reading Output of Another Command
By passing different arguments for stdin, stdout, and stderr it is possible to mimic the variations of os.popen().
Reading from the output of a pipe:
print '\nread:' proc = subprocess.Popen('echo "to stdout"', shell=True, stdout=subprocess.PIPE, ) stdout_value = proc.communicate()[0] print '\tstdout:', repr(stdout_value)
Writing to the input of a pipe:
print '\nwrite:' proc = subprocess.Popen('cat -', shell=True, stdin=subprocess.PIPE, ) proc.communicate('\tstdin: to stdin\n')
Reading and writing, as with popen2:
print '\npopen2:' proc = subprocess.Popen('cat -', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) stdout_value = proc.communicate('through stdin to stdout')[0] print '\tpass through:', repr(stdout_value)
Separate streams for stdout and stderr, as with popen3:
print '\npopen3:' proc = subprocess.Popen('cat -; echo ";to stderr" 1>&2', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) stdout_value, stderr_value = proc.communicate('through stdin to stdout') print '\tpass through:', repr(stdout_value) print '\tstderr:', repr(stderr_value)
Merged stdout and stderr, as with popen4:
print '\npopen4:' proc = subprocess.Popen('cat -; echo ";to stderr" 1>&2', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, ) stdout_value, stderr_value = proc.communicate('through stdin to stdout\n') print '\tcombined output:', repr(stdout_value)
Sample output:
read: stdout: 'to stdout\n' write: stdin: to stdin popen2: pass through: 'through stdin to stdout' popen3: pass through: 'through stdin to stdout' stderr: ';to stderr\n' popen4: combined output: 'through stdin to stdout\n;to stderr\n'
All of the above examples assume a limited amount of interaction. The communicate() method reads all of the output and waits for child process to exit before returning. It is also possible to write to and read from the individual pipe handles used by the Popen instance. To illustrate this, I will use this simple echo program which reads its standard input and writes it back to standard output:
import sys sys.stderr.write('repeater.py: starting\n') while True: next_line = sys.stdin.readline() if not next_line: break sys.stdout.write(next_line) sys.stdout.flush() sys.stderr.write('repeater.py: exiting\n')
Make note of the fact that repeater.py writes to stderr when it starts and stops. We can use that to show the lifetime of the subprocess in the next example. The following interaction example uses the stdin and stdout file handles owned by the Popen instance in different ways. In the first example, a sequence of 10 numbers are written to stdin of the process, and after each write the next line of output is read back. In the second example, the same 10 numbers are written but the output is read all at once using communicate().
import subprocess print 'One line at a time:' proc = subprocess.Popen('repeater.py', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) for i in range(10): proc.stdin.write('%d\n' % i) output = proc.stdout.readline() print output.rstrip() proc.communicate() print print 'All output at once:' proc = subprocess.Popen('repeater.py', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) for i in range(10): proc.stdin.write('%d\n' % i) output = proc.communicate()[0] print output
Notice where the "repeater.py: exiting" lines fall in the output for each loop:
$ python interaction.py One line at a time: repeater.py: starting 0 1 2 3 4 5 6 7 8 9 repeater.py: exiting All output at once: repeater.py: starting repeater.py: exiting 0 1 2 3 4 5 6 7 8 9
Signaling Between Processes
In part 4 of the series on the os module I included an example of signaling between processes using os.fork() and os.kill(). Since each Popen instance provides a pid attribute with the process id of the child process, it is possible to do something similar with subprocess. For this example, I will again set up a separate script for the child process to be executed by the parent process.
import os import signal import time def signal_usr1(signum, frame): "Callback invoked when a signal is received" pid = os.getpid() print 'Received USR1 in process %s' % pid print 'CHILD: Setting up signal handler' signal.signal(signal.SIGUSR1, signal_usr1) print 'CHILD: Pausing to wait for signal' time.sleep(5)
And now the parent process:
import os import signal import subprocess import time proc = subprocess.Popen('signal_child.py') print 'PARENT: Pausing before sending signal...' time.sleep(1) print 'PARENT: Signaling %s' % proc.pid os.kill(proc.pid, signal.SIGUSR1)
And the output should look something like this:
$ python signal_parent.py CHILD: Setting up signal handler CHILD: Pausing to wait for signal PARENT: Pausing before sending signal... PARENT: Signaling 4124 Received USR1 in process 4124
Conclusions
As you can see, subprocess can be much easier to work with than fork, exec, and pipes on their own. It provides all of the functionality of the other modules and functions it replaces, and more. The API is consistent for all uses and many of the extra steps of overhead needed (such as closing extra file descriptors, ensuring the pipes are closed, etc.) are "built in" instead of being handled by your code separately.
References:
Python Module of the Week
Sample code
PyMOTW: os (Part 2)
PyMOTW: os (Part 4)
发表评论
-
lost on Py_DECREF/INCREF when handling PyList_Append in Python C extension
2015-11-03 21:41 1066The main hint is in the docs, i ... -
How can I convert a character to a integer in Python, and viceversa?
2015-10-27 14:38 746Use chr() and ord(): >>& ... -
Date/Time处理函数总结 [To Do]
2013-04-12 10:46 733几种我所用到的用来处理日期,时间的函数总结。 Perl 1 ... -
Twisted中的DeferredList
2013-02-21 17:08 1246在这个blog上学习twisted。 http://blog ... -
python中list类型相减
2009-10-16 09:00 8227两个list ()类型相减 就是比如 a=[1,2,3, ... -
python中的import
2009-10-12 17:00 1107什么时候你应该使用 from module import? ... -
python中的and-or技巧
2009-09-29 09:27 1612>>> a = "first&qu ... -
python中使用可选参数和命名参数
2009-09-28 11:35 3130Python 允许函数参数有缺省值;如果调用函数时不使用参 ... -
python中的连续赋值
2009-09-28 10:10 1913连续值赋值 >>> range(7) ... -
python中的boolean
2009-09-28 09:55 4449在 2.2.1 版本之前,Python 没有单独 ... -
Python 和其他编程语言数据类型的比较
2009-09-27 14:43 1322摘自《Dive into Python》。 静态类型语言 ... -
python中删除非空目录
2009-08-25 21:08 5877import shutil shutil.rmtree ... -
python中使用随机数
2009-08-05 09:35 1554随机整数: >>> import rand ... -
Example of Using getopt in Python
2009-07-24 12:31 1352import getopt, sys def main( ... -
python脚本参数处理的一个技巧
2009-07-23 23:20 1787import sys wid ... -
Turn to Python from Perl: example of SSH in multi-threads
2009-07-21 16:39 3985I need to execute comma ...
相关推荐
"基于Comsol的采空区阴燃现象研究:速度、氧气浓度、瓦斯浓度与温度分布的二维模型分析",comsol采空区阴燃。 速度,氧气浓度,瓦斯浓度及温度分布。 二维模型。 ,comsol; 采空区; 阴燃; 速度; 氧气浓度; 瓦斯浓度; 温度分布; 二维模型;,"COMSOL模拟采空区阴燃:速度、浓度与温度分布的二维模型研究"
安全驱动的边云数据协同策略研究.pdf
MATLAB代码实现电-气-热综合能源系统耦合优化调度模型:精细电网、气网与热网协同优化,保姆级注释参考文档详可查阅。,MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦合 参考文档:自编文档,非常细致详细,可联系我查阅 仿真平台:MATLAB YALMIP+cplex gurobi 主要内容:代码主要做的是一个考虑电网、热网以及气网耦合调度的综合能源系统优化调度模型,考虑了电网与气网,电网与热网的耦合,算例系统中,电网部分为10机39节点的综合能源系统,气网部分为比利时20节点的配气网络,潮流部分电网是用了直流潮流,气网部分也进行了线性化的操作处理,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源 ,关键词:MATLAB代码; 电-气-热综合能源系统; 耦合优化调度; 电网; 热网; 气网; 潮流; 直流潮流; 线性化处理; 保姆级注释; 人性化模块子程序; 可靠数据来源。,MATLAB代码:电-气-热综合能源系统耦合优化调度模型(保姆级注释,数据来源可靠)
内容概要:本文详细探讨了人工智能(AI)对就业市场的深远影响及其发展趋势。首先介绍了到2027年,44%的工人核心技能将受技术变革尤其是AI影响的事实,并提及自动化可能取代部分工作的现象。其次指出虽然某些职位面临风险,但也带来了全新的职业机遇与现有角色改进的可能性,关键在于人类要学会借助AI释放自身潜力并培养软实力,以适应快速发展的科技需求。再者,强调终身学习理念下企业和教育培训须革新教学手段与评估机制,以便紧跟AI进化速率,为个体和社会持续注入新动力。最后提到了教育机构应当加快调整步伐以匹配技术变革的速度,并利用AI实现个性化的教育,进而提升学习者的适应能力和解决问题的能力。 适用人群:政策制定者、企业管理层、在职人员及教育工作者,还有广大学生群体均能从中获得启示。 使用场景及目标:面向关注未来职场动向及教育发展方向的专业人士,提供前瞻性思考角度,助力各界积极规划职业生涯路径或调整教育资源分配策略。 其他说明:本文综合多位行业领袖的观点展开讨论,旨在唤起社会各界共同思考AI带来的变革及对策,而非单方面渲染危机感。
2025最新空调与制冷作业考试题及答案.doc
2025最新初级电工证考试题及答案.docx
飞剪PLC控制系统——采用西门子S7-200SMART和触摸屏实现智能化操控及图纸详述,飞锯追剪程序,PLC和触摸屏采用西门子200smart,包含图纸,触摸屏程序和PLC程序。 ,核心关键词:飞锯追剪程序; 西门子200smart; PLC程序; 触摸屏程序; 图纸; 控制系统。,"西门子200smart飞锯追剪系统程序包:含图纸、PLC与触摸屏程序"
使用PyQt6制作的Python应用程序。
三相桥式整流电路双闭环控制策略:电压外环与电流内环协同优化研究,三相桥式整流电路双闭环控制 电流内环 电压外环(也有开环控制) 采用电压电流双闭环控制,在电压、电流控制电路中,电压单环控制易于设计和分析,但是响应速度慢,无限流功能。 而电流环能增强电路稳定性、响应速度快。 三相桥式全控整流电路由整流变压器、阴极相连接的晶闸管(VT1, VT3, VT5)、阳极相连接的晶闸管(VT4, VT6, VT2)、负载、触发器和同步环节组成(如图1),6个晶闸管依次相隔60°触发,将电源交流电整流为直流电。 matlab仿真模型(开闭环都有)控制效果良好,可写报告。 ,三相桥式整流电路;双闭环控制;电流内环;电压外环;开环控制;MATLAB仿真模型。,基于双闭环控制的电压电流三相整流技术分析与Matlab仿真实现
MATLAB四旋翼仿真PID控制:从入门到精通的手把手教学,含QAV方法、模型代码、Simulink布局思路及详细图文说明,MATLAB四旋翼仿真 PID控制,有完全对应的说明文档,专门为初级学习者提供。 不用问在不在,直接拿即可。 亮点: 拥有和模型完全对应的讲解文档,相当于手把手教学。 内容包括: 1.QAV详细方法 2.模型及代码 3.模型2(提供simulink排版布局思路) 4.相关图片 5.使用备注 ,核心关键词:MATLAB四旋翼仿真; PID控制; 完全对应说明文档; 初级学习者; QAV详细方法; 模型及代码; simulink排版布局思路; 相关图片; 使用备注。,"MATLAB四旋翼仿真教程:PID控制详解与手把手教学"
定子磁链控制下的直接转矩控制系统MATLAB仿真研究及结果分析报告,基于定子磁链控制的直接转矩控制系统 MATLAB SIMULINK仿真模型(2018b)及说明报告,仿真结果良好。 报告第一部分讨论异步电动机的理论基础和数学模型,第二部分介绍直接转矩控制的具体原理,第三部分对调速系统中所用到的脉宽调制技术CFPWM、SVPWM进行了介绍,第四部分介绍了MATLAB仿真模型的搭建过程,第五部分对仿真结果进行了展示及讨论。 ,关键词:定子磁链控制;直接转矩控制系统;MATLAB SIMULINK仿真模型;异步电动机理论基础;数学模型;直接转矩控制原理;脉宽调制技术CFPWM;SVPWM;仿真结果。,基于MATLAB的异步电机直接转矩控制仿真研究报告
2025中小学教师编制考试教育理论基础知识必刷题库及答案.pptx
Python游戏编程源码-糖果消消消.zip
三相PWM整流器双闭环控制:电压外环电流内环的SVPWM调制策略及其代码编写详解——动态稳态特性优越的技术参考。,三相PWM整流器双闭环控制,电压外环,电流内环,PLL。 采用SVPWM调制,代码编写。 动态和稳态特性较好,可提供参考资料 ,三相PWM整流器;双闭环控制;电压外环;电流内环;PLL调制;SVPWM调制;动态特性;稳态特性;参考资料,三相PWM整流器双闭环SVPWM调制策略:稳态与动态特性优化参考指南
永磁同步电机滑膜观测器参数识别与仿真研究:转动惯量、阻尼系数及负载转矩的Matlab Simulink仿真分析文章及文档说明,永磁同步电机 滑膜观测器参数识别Matlab simulink仿真 包括转动惯量 阻尼系数 负载转矩 波形很好 跟踪很稳 包含仿真文件说明文档以及文章 ,关键词:永磁同步电机;滑膜观测器;参数识别;Matlab simulink仿真;转动惯量;阻尼系数;负载转矩;波形质量;跟踪稳定性;仿真文件;说明文档;文章。,基于Matlab Simulink仿真的永磁同步电机滑膜观测器参数识别及性能分析
基于永磁涡流的电梯缓冲结构设计.pdf
Python自动化办公源码-28 Python爬虫爬取网站的指定文章
MATLAB下的安全强化学习:利用Constraint Enforcement块训练代理实现目标接近任务,MATLAB代码:安全 强化学习 关键词:safe RL 仿真平台:MATLAB 主要内容:此代码展示了如何使用 Constraint Enforcement 块来训练强化学习 (RL) 代理。 此块计算最接近受约束和动作边界的代理输出的动作的修改控制动作。 训练强化学习代理需要 Reinforcement Learning Toolbox 。 在此示例中,代理的目标是使绿球尽可能靠近红球不断变化的目标位置。 具体步骤为创建用于收集数据的环境和代理,学习约束函数,使用约束强制训练代理,在没有约束执行的情况下训练代理。 ,核心关键词:safe RL; MATLAB代码; Constraint Enforcement 块; 强化学习代理; 绿球; 红球目标位置; 数据收集环境; 约束函数; 约束强制训练; 无约束执行训练。,MATLAB中安全强化学习训练的约束强化代理实现
基于EtherCAT总线网络的锂电池激光制片机控制系统,融合欧姆龙NX系列与威伦通触摸屏的智能制造方案。,锂电池激光模切机 欧姆龙NX1P2-1140DT,威伦通触摸屏,搭载从机扩展机架控制,I输入输出IO模块模拟量模块读取控制卷径计算 汇川IS620N总线伺服驱动器7轴控制,总线纠偏器控制 全自动锂电池激光制片机,整机采用EtherCAT总线网络节点控制, 伺服凸轮同步运动,主轴虚轴控制应用,卷径计算,速度计算,放卷张力控制。 触摸屏设计伺服驱动器报警代码,MC总线报警代码,欧姆龙伺服报警代码 张力摆臂控制,PID控制,等等 触摸屏产量统计,触摸屏故障统计,触摸屏与PLC对接信息交互,触摸屏多账户使用,多产品配方程序,优秀的触摸屏模板。 NX在收放卷控制的设计 欧姆龙NX系列实际项目程序+威纶触摸屏程序+新能源锂电设备 涵盖威纶通人机,故障记录功能,st+梯形图+FB块,注释齐全。 ,"新能源锂电池激光模切机:欧姆龙NX与威纶通触摸屏的智能控制与信息交互系统"
2025装载机理论考试试题库(含答案).pptx