Python之子进程subprocess模块
http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html
http://blog.csdn.net/jgood/article/details/4498166
http://docs.python.org/library/subprocess
subprocess.call()
[root@typhoeus79 20130925]# more test.py
#!/usr/bin/env python2.7
#-*- coding:utf8 -*- import subprocess rc = subprocess.call(["ls","-l"]) print "rc = ",rc
[root@typhoeus79 20130925]# ./test.py
total 4
-rwxr-xr-x 1 root root 118 Sep 25 11:18 test.py
rc = 0
将程序名ls和其对应的参数放在一个list中传给subprocess.call()
通过一个shell来解释字符串
[root@typhoeus79 20130925]# ./sub_shell.py
total 4
-rwxr-xr-x 1 root root 125 Sep 25 11:22 sub_shell.py
rc = 0
[root@typhoeus79 20130925]# more sub_shell.py
#!/usr/bin/env python2.7
#-*- coding:utf8 -*- import subprocess rc = subprocess.call("ls -l",shell=True) print "rc = ",rc
使用shell=True这个参数,使用字符串而不是使用list来运行子进程。python先运行一个shell,然后这个shell来解释整个字符串
Popen
基于Popen()的封装(wrapper),这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程
Using the subprocess module
===========================
This module defines one class called Popen: class Popen(args, bufsize=0, executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=False, shell=False,
cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0):
[root@typhoeus79 20130925]# ./sub_popen.py
parent process
<subprocess.Popen object at 0x7fed17542050>
[root@typhoeus79 20130925]# PING www.a.shifen.com (220.181.111.148) 56(84) bytes of data. --- www.a.shifen.com ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4002ms [root@typhoeus79 20130925]# more sub_popen.py
#!/usr/bin/env python26
#-*- coding:utf8 -*- import subprocess child = subprocess.Popen(["ping","-c","","www.baidu.com"])
#child = subprocess.Popen("ping -c5 www.baidu.com",shell=True) print("parent process")
print child
父进程在开启子进程之后没有等到其完成,而是直接print
改成等待模式:
[root@typhoeus79 20130925]# ./sub_popen.py
PING www.a.shifen.com (220.181.112.143) 56(84) bytes of data. --- www.a.shifen.com ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4001ms parent process
<subprocess.Popen object at 0x7fe424c34050>
[root@typhoeus79 20130925]# more sub_popen.py
#!/usr/bin/env python26
#-*- coding:utf8 -*- import subprocess child = subprocess.Popen(["ping","-c","","www.baidu.com"]) child.wait()
print("parent process")
print child
父进程中对子进程进行其他操作:
child.poll() #检查子进程状态
child.kill() #终止子进程
child.send_signal() #向子进程发送信号
child.terminate() #终止子进程
子进程的PID存储在child.pid中
子进程的文本流控制
子进程的标准输入、标准输出、标准错误通过如下属性:
{'_child_created': True, 'returncode': 1, 'stdout': None, 'stdin': None, 'pid': 7070, 'stderr': None, 'universal_newlines': False}
child.stdin
child.stdout
child.stderr
可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出在一起,构成管道pipe:
[root@typhoeus79 20130925]# more sub_pipe.py
#!/usr/bin/env python26
#-*- coding:utf8 -*- import subprocess child1 = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) child2 = subprocess.Popen(["wc"],stdin=child1.stdout,stdout=sub
process.PIPE) out = child2.communicate() print out
[root@typhoeus79 20130925]# ./sub_pipe.py
(' 4 29 167\n', None)
1、child1的stdout将文本输出缓存到subprocess.PIPE中
2、child2的stdin从child1的stdout读取文本
3、child2的输出文本也被存储在subprocess.PIPE中
4、communicate()方法从PIPE中读取相应的文本
communicate是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。
communicate(input=None)
Interact with process: Send data to stdin. Read data from stdout
and stderr, until end-of-file is reached. Wait for process to
terminate. The optional input argument should be a string to be
sent to the child process, or None, if no data should be sent to
the child. communicate() returns a tuple (stdout, stderr). Note: The data read is buffered in memory, so do not use this
method if the data size is large or unlimited.
可以使用communicate()方法使用PIPE给子进程输入:
#!/usr/bin/env python26
#-*- coding:utf8 -*- import subprocess
import time child = subprocess.Popen(["cat"],stdin=subprocess.PIPE) time.sleep(5)
child.communicate("Hello\n")
通过time.sleep也可以看到communicate是阻塞父进程
对python执行系统命令的封装
def sys_command(system_cmd):
logger.debug("system_cmd = '%s'." %system_cmd)
pipe = subprocess.Popen(system_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True,stdin=subprocess.PIPE) stdout, stderr = pipe.communicate()
returncode = pipe.returncode logger.debug("returncode = '%d'." %returncode)
logger.debug("stdout = '%s'." %stdout)
logger.debug("stderr = '%s'." %stderr) return returncode,stdout,stderr
Python之子进程subprocess模块的更多相关文章
- python笔记之subprocess模块
python笔记之subprocess模块 [TOC] 从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spaw ...
- Python中的subprocess模块
Subprocess干嘛用的? subprocess模块是python从2.4版本开始引入的模块.主要用来取代 一些旧的模块方法,如os.system.os.spawn*.os.popen*.comm ...
- python学习之-- subprocess模块
subprocess 模块 功能:用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以及获得它们的返回值.它用来代替多个旧模块和函数: os.system os.spawn* os.popen ...
- Python中使用subprocess模块远程执行命令
使用subprocess模块执行远程命令 服务端代码 1 import socket 2 import subprocess 3 4 sh_server = socket.socket() 5 sh_ ...
- python学习之subprocess模块
subprocess.Popen 这个模块主要就提供一个类Popen: class subprocess.Popen( args, bufsize=0, executable=None, stdin= ...
- random模块、os模块、序列化模块、sy模块s、subprocess模块
random随机数模块 random.random( ) 随机产生一个0-1之间的小数 print(random.random()) # 0.31595547439342897 random.rand ...
- Python subprocess模块学习总结
从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn*.os.popen*.popen2.*.comman ...
- 子进程管理模块subprocess
subprocess模块允许你生成子进程,连接管道,并获取返回的代码. 一.使用subprocess模块 模块中定义了一个Popen类: subprocess.Popen(args, bu ...
- Python学习笔记——基础篇【第六周】——Subprocess模块
执行系统命令 可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen* --废弃 popen2.* --废弃 com ...
随机推荐
- Two-phase clustering process for outliers detection 文章翻译
基于二阶段聚集模式的异常探测 M.F .Jiang, S.S. Tseng *, C.M. Su 国立交通大学计算机与信息科学系,中国台北市新竹路100150号 1999年11月17日; 2000年4 ...
- every();some();filter();map();forEach()各自区别:
every();some();filter();map();forEach()各自区别: (1)every()方法:(返回值为boolean类型) 对数组每一项都执行测试函数,知道获得对指定的函数返回 ...
- 一些实用的JQuery代码片段收集(筛选,搜索,样式,清除默认值,多选等)
//each遍历文本框 清空默认值 $(".maincenterul1").find("input,textarea").each(function () { ...
- centos 7.3二进制安装mariadb10.2.8完美步骤
(1)在centos7系统上,yum info mariadb可以找到提供mariadb包的官方网站,在到官方网站下载最新的mariadb包,然后rz到linux系统上去 (2)准备用户 1.user ...
- plsql部分字段中文乱码,sqlplus中文乱码
PLSQL中文乱码 问题: 解决: 思路1:设置 export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 结果:并不能解决问题! ...
- cocos2dx - 生成怪物及AI
接上一节内容:cocos2dx - tmx地图分层移动处理 本节怪物及简单AI实现 一.怪物 同cocos2dx - v2.3.3编辑器骨骼动画 里创建的CPlalyer一样,新建一个CMonster ...
- 为什么阿里的程序员那么帅?---原来他们都有"编码规约扫描"神器在手
为了迎接十九大的到来,帝都城这几天也是满城风雨,听说早高峰期地铁站的人都排到天桥上了,哎,这就是该死的北漂生活.但是无论怎样,我依然在北京向各位问好! 之前总结过俩篇关于阿里Java开发手册的编程规约 ...
- 当谈到 GitLab CI 的时候,我们该聊些什么(上篇)
"微服务"这个概念近两年非常热,正在慢慢改变 DevOps 的思路.微服务架构把一个庞大的业务系统拆解开来,每一个组件变得更加独立自治.松耦合.但是,同时也伴随着部署单元粒度越来越 ...
- 框架应用 : Spring MVC - 开发详述
软件开发中的MVC设计模式 软件开发的目标是减小耦合,让模块之前关系清晰. MVC模式在软件开发中经常和ORM模式一起应用,主要作用是将(数据抽象,数据实体传输和前台数据展示)分层,这样前台,后台,数 ...
- JavaScript对象之关联数组
Tip: 内容摘抄自<JavaScript权威指南>,看过该书的同学可以忽略本文. 存取一个对象的属性的方式: obj.attr; obj["attr"]; 两者最重要 ...