二、应用实例解析

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详解与应用实例 之三的更多相关文章

  1. python子进程模块subprocess详解与应用实例 之一

    subprocess--子进程管理器 一.subprocess 模块简介 subprocess最早是在2.4版本中引入的. subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/ ...

  2. python子进程模块subprocess详解与应用实例 之二

    1.2. Popen 对象 Popen类的实例有下列方法: 1. Popen.poll() 检查子进程是否已经结束,设置并返回返回码值. 2. Popen.wait() 等待子进程结束,设置并返回返回 ...

  3. python子进程模块subprocess详解

    subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...

  4. python之模块datetime详解

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块datetime详解 import datetime #data=datetime.dat ...

  5. Python Deque 模块使用详解,python中yield的用法详解

    Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...

  6. python——pickle模块的详解

    pickle模块详解 该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反 ...

  7. Python编程之子进程管理(subprocess)详解

    引言 在写程序时,我们无法避免需要运行外部程序,相较于功能比较简单的os.system(),更加倾向于使用subprocess模块来执行外部程序. 模块介绍 subprocess.run() 使用su ...

  8. python datetime模块参数详解

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块,它提供 的接口与C标准库time.h基本一致.相比于time模块,datetime模块的接 ...

  9. python re模块findall()详解

    今天写代码,在写到郑泽的时候遇到了一个坑,这个坑是re模块下的findall()函数. 下面我将结合代码,记录一下 import re string="abcdefg acbdgef abc ...

随机推荐

  1. HAWQ取代传统数仓实践(十七)——事实表技术之累积度量

    累积度量指的是聚合从序列内第一个元素到当前元素的数据,例如统计从每年的一月到当前月份的累积销售额.本篇说明如何在销售订单示例中实现累积月销售数量和金额,并对数据仓库模式.初始装载.定期装载做相应地修改 ...

  2. flex 弹性布局的大坑!!

    如果父元素设置 display:flex,那么其中的子元素会被当成行内元素对待,即会忽略其宽度 这在设置背景图时要特别特别注意!!!!

  3. Golang Printf、Sprintf 、Fprintf 格式化

    /* %v 输出结构体 {10 30} %+v 输出结构体显示字段名 {one:10 tow:30} %#v 输出结构体源代码片段 main.Point{one:10, tow:30} %T 输出值的 ...

  4. phpcms v9 tags调用方法

    {loop $keywords $keyword} <a href="{APP_PATH}index.php?m=content&c=tag&catid={$catid ...

  5. 【JavsScript高级程序设计】学习笔记[1]

    1. 在HTML中使用javascript 在使用script嵌入脚本时,脚本内容不能包含'</script>'字符串(会被认为是结束的标志).可以通过转义字符解决('\') 默认scri ...

  6. BZOJ - 3622:已经没有什么好害怕的了 (广义容斥)

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  7. JDBC 4 PreparedStatement 与Statement 的区别

    1  有安全性 PreparedStatement 可以由于不是使用拼接,防止了sql注入,提高了安全性. 2  更方便 PreparedStatement 可以自动对类型进行转换,代码可读性,可维护 ...

  8. 利用DAC(Data-tier Application)实现数据库结构迁移

    从一个存在的库,抽取其表结构,对象,权限等,再部署成一个不包含数据的"空库"的方法有很多种.如自带的Generate Scripts功能,自定义脚本提取创建脚本等. 在实际使用中, ...

  9. Win7旗舰版一直显示检查更新的问题

    最近部门机器从新安装win7 64位 旗舰版之后,每次检查更新,都会一直卡在检查更新的界面过不去,上网搜了一下,看到了网友提供的解决办法, 测试了一下,果然可以.记录下来,以备后用: 到微软官网去下载 ...

  10. 对DDS的深度认识

    我知道,我对与电子有关的所有事情都很着迷,但不论从哪个角度看,今天的现场可编程门阵列(FPGA),都显得“鹤立鸡群”,真是非常棒的器件.如果在这个智能时代,在这个领域,想拥有一技之长的你还没有关注FP ...