python子进程模块subprocess详解与应用实例 之三
二、应用实例解析
2.1 subprocess模块的使用
1. subprocess.call
>>> subprocess.call(["ls", "-l"])
0
>>> subprocess.call("exit 1", shell=True)
1
2. 调用系统中cmd命令,显示命令执行的结果:
x=subprocess.check_output(["echo", "Hello World!"],shell=True)
print(x)
"Hello World!"
3. 在python中显示文件内容:
y=subprocess.check_output(["type", "app2.cpp"],shell=True)
print(y)
#include
using namespace std;
......
4. 查看ipconfig -all命令的输出,并将将输出保存到文件tmp.log中:
handle = open(r'd:\tmp.log','wt')
subprocess.Popen(['ipconfig','-all'], stdout=handle)
5. 查看网络设置ipconfig -all,保存到变量中
output = subprocess.Popen(['ipconfig','-all'], stdout=subprocess.PIPE,shell=True)
oc=output.communicate() #取出output中的字符串
#communicate() returns a tuple (stdoutdata, stderrdata).
print(oc[0]) #打印网络信息
Windows IP Configuration
Host Name . . . . .
6. 如果想频繁地和子线程通信,那么不能使用communicate();
因为communicate通信一次之后即关闭了管道.这时可以试试下面的方法:
p= subprocess.Popen(["wc"], stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
p.stdin.write('your command')
p.stdin.flush()
#......do something
try:
#......do something
p.stdout.readline()
#......do something
except:
print('IOError')
#......do something more
p.stdin.write('your other command')
p.stdin.flush()
#......do something more
2.2 subprocess子进程和管道进行交互
其实在python中,和shell脚本,其他程序交互的方式有很多,比如:
os.system(cmd),os.system只是执行一个shell命令,不能输入、且无返回
os.open(cmd),可以交互,但是是一次性的,调用都少次都会创建和销毁多少次进程,性能太差
1. 一个简单的例子,调用ls命令,两者之间是没有交互的:
import subprocess
p = subprocess.Popen('ls')
2. 在程序中获取输出的例子:
import subprocess
p = subprocess.Popen('ls',stdout=subprocess.PIPE)
print p.stdout.readlines()
3. 有输入,有输出的例子,
父进程发送'say hi',子进程输出 test say hi,父进程获取输出并打印
#test1.py
import sys
line = sys.stdin.readline()
print 'test',line
#run.py
from subprocess import *
p =Popen('./test1.py',stdin=PIPE,stdout=PIPE)
p.stdin.write('say hi/n')
print p.stdout.readline()
#result
test say hi
4. 连续输入和输出的例子
# test.py
import sys
while True:
line = sys.stdin.readline()
if not line:break
sys.stdout.write(line)
sys.stdout.flush()
# run.py
import sys
from subprocess import *
proc = Popen('./test.py',stdin=PIPE,stdout=PIPE,shell=True)
for line in sys.stdin:
proc.stdin.write(line)
proc.stdin.flush()
output = proc.stdout.readline()
sys.stdout.write(output)
注意,run.py的flush和test.py中的flush,要记得清空缓冲区,否则程序得不到正确的输入和输出
2.3 python 实时获取子进程输出
1. 方法一
import subprocess
def main():
process1 = subprocess.Popen("python -u sub.py", shell=False, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)
#print process1.communicate()[0]
while True:
line = process1.stdout.readline()
if not line:
break
print line
if __name__ == '__main__':
main()
2. 方法二:
import subprocess
import time
p = subprocess.Popen('ping 127.0.0.1 -n 10', stdout=subprocess.PIPE)
while p.poll() == None:
print p.stdout.readline()
time.sleep(1)
print p.stdout.read()
print 'returen code:', p.returncode
参考:
http://blog.csdn.net/junshao90/article/details/8215751
http://blog.csdn.net/b_h_l/article/details/10080171
http://blog.csdn.net/marising/article/details/6551692
from:http://blog.chinaunix.net/uid-26000296-id-4461555.html
python子进程模块subprocess详解与应用实例 之三的更多相关文章
- python子进程模块subprocess详解与应用实例 之一
subprocess--子进程管理器 一.subprocess 模块简介 subprocess最早是在2.4版本中引入的. subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/ ...
- python子进程模块subprocess详解与应用实例 之二
1.2. Popen 对象 Popen类的实例有下列方法: 1. Popen.poll() 检查子进程是否已经结束,设置并返回返回码值. 2. Popen.wait() 等待子进程结束,设置并返回返回 ...
- python子进程模块subprocess详解
subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...
- python之模块datetime详解
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块datetime详解 import datetime #data=datetime.dat ...
- Python Deque 模块使用详解,python中yield的用法详解
Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...
- python——pickle模块的详解
pickle模块详解 该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反 ...
- Python编程之子进程管理(subprocess)详解
引言 在写程序时,我们无法避免需要运行外部程序,相较于功能比较简单的os.system(),更加倾向于使用subprocess模块来执行外部程序. 模块介绍 subprocess.run() 使用su ...
- python datetime模块参数详解
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块,它提供 的接口与C标准库time.h基本一致.相比于time模块,datetime模块的接 ...
- python re模块findall()详解
今天写代码,在写到郑泽的时候遇到了一个坑,这个坑是re模块下的findall()函数. 下面我将结合代码,记录一下 import re string="abcdefg acbdgef abc ...
随机推荐
- 用函数式编程,从0开发3D引擎和编辑器(一)
介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方 ...
- display:box属性
在移动端开发的时候,圣杯布局,弹性盒,是我们经常会用得到的,W3C很久以前就有一个display:box属性 flex是最新的,但是在实际的浏览器测试中,display: flex 不能完全替代dis ...
- HDU - 6268: Master of Subgraph (分治+bitset优化背包)
题意:T组样例,给次给出一个N节点的点权树,以及M,问连通块的点权和sum的情况,输出sum=1到M,用0或者1表示. 思路:背包,N^2,由于是无向的连通块,所以可以用分治优化到NlgN. 然后背包 ...
- yield 与生成器
yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数 ...
- CentOS7 配置光盘iso镜像为本地yum源
因为系统使用的最小化安装,所以很多软件没有安装上,又无法上网,为了方便,所以直接将上传的iso镜像直接作为yum源. 我已经将光盘的iso镜像上传至服务器. 接下来就是将iso的光盘镜像进行挂载了 m ...
- LG3380 3380 【模板】二逼平衡树(树套树)
题意 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在区间内的前驱(前驱定义为严格小于x ...
- 企业建站系统MiinCMP1.0.5 版公布!
2014-5-4,在青年节,Juuluu公布了其企业建站系统的新版1.0.5,经过两周多的奋战,Juuluu团队为MiinCMP新浪云版的移植工作做了大量工作.1.0.5已可完美执行于国内免费的jav ...
- ORACLE系统表大全
下面全面是对Oracle系统表的一些介绍: 数据字典dict总是属于Oracle用户sys的. 1.用户: select username from dba_users; 改口令 alter user ...
- IaaS vs PaaS vs SaaS
在云计算的早期阶段,企业面临的最大问题是他们是否应该使用公共云服务.如今,几乎所有的组织都在采用一些公共云服务.更重要的问题是企业应该使用哪种云服务:基础设施即服务(IaaS),平台即服务(PaaS) ...
- asp.net数据分页方法
/// <summary> /// 数据分页方法 /// </summary> /// <param name="PageIndex">当前页& ...