博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python的subprocess模块(写的不错留作查询)
阅读量:6417 次
发布时间:2019-06-23

本文共 3310 字,大约阅读时间需要 11 分钟。

python的subprocess模块subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。常用方法:subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令示例如下:复制代码>>> a = subprocess.call(['df','-hT'],shell=False)Filesystem    Type    Size  Used Avail Use% Mounted on/dev/sda2     ext4     94G   64G   26G  72% /tmpfs        tmpfs    2.8G     0  2.8G   0% /dev/shm/dev/sda1     ext4    976M   56M  853M   7% /boot>>> a = subprocess.call('df -hT',shell=True)Filesystem    Type    Size  Used Avail Use% Mounted on/dev/sda2     ext4     94G   64G   26G  72% /tmpfs        tmpfs    2.8G     0  2.8G   0% /dev/shm/dev/sda1     ext4    976M   56M  853M   7% /boot>>> print a0复制代码 subprocess.check_call():用法与subprocess.call()类似,区别是,当返回值不为0时,直接抛出异常示例:复制代码>>> a = subprocess.check_call('df -hT',shell=True)Filesystem    Type    Size  Used Avail Use% Mounted on/dev/sda2     ext4     94G   64G   26G  72% /tmpfs        tmpfs    2.8G     0  2.8G   0% /dev/shm/dev/sda1     ext4    976M   56M  853M   7% /boot>>> print a0>>> a = subprocess.check_call('dfdsf',shell=True)/bin/sh: dfdsf: command not foundTraceback (most recent call last):  File "
", line 1, in
File "/usr/lib64/python2.6/subprocess.py", line 502, in check_call raise CalledProcessError(retcode, cmd)subprocess.CalledProcessError: Command 'dfdsf' returned non-zero exit status 127复制代码 subprocess.check_output():用法与上面两个方法类似,区别是,如果当返回值为0时,直接返回输出结果,如果返回值不为0,直接抛出异常。需要说明的是,该方法在python3.x中才有。 subprocess.Popen():在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess的Popen()方法。该方法有以下参数:args:shell命令,可以是字符串,或者序列类型,如list,tuple。bufsize:缓冲区大小,可不用关心stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误shell:与上面方法中用法相同cwd:用于设置子进程的当前目录env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符 示例1,在/root下创建一个suprocesstest的目录:>>> a = subprocess.Popen('mkdir subprocesstest',shell=True,cwd='/root') 示例2,使用python执行几个命令:复制代码import subprocessobj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)obj.stdin.write('print 1 \n')obj.stdin.write('print 2 \n')obj.stdin.write('print 3 \n')obj.stdin.write('print 4 \n')obj.stdin.close()cmd_out = obj.stdout.read()obj.stdout.close()cmd_error = obj.stderr.read()obj.stderr.close()print cmd_outprint cmd_error复制代码 也可以使用如下方法:复制代码import subprocessobj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)obj.stdin.write('print 1 \n')obj.stdin.write('print 2 \n')obj.stdin.write('print 3 \n')obj.stdin.write('print 4 \n')out_error_list = obj.communicate()print out_error_list复制代码 示例3,将一个子进程的输出,作为另一个子进程的输入:import subprocesschild1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)out = child2.communicate() 其他方法:复制代码import subprocesschild = subprocess.Popen('sleep 60',shell=True,stdout=subprocess.PIPE)child.poll() #检查子进程状态child.kill() #终止子进程child.send_signal() #向子进程发送信号child.terminate() #终止子进程
原文作者:https://www.cnblogs.com/breezey/p/6673901.html

  

转载于:https://www.cnblogs.com/zhaohongtaodepython/p/9379450.html

你可能感兴趣的文章
产品设计体会(3013)项目的“敏捷沟通”实践
查看>>
RHEL6.3基本网络配置(1)ifconfig命令
查看>>
网络诊断工具之—路由追踪tracert命令
查看>>
Java模拟HTTP的Get和Post请求(增强)
查看>>
php 环境搭建(windows php+apache)
查看>>
让虚拟机的软盘盘符不显示(适用于所有windows系统包括Windows Server)
查看>>
Cygwin不好用
查看>>
jQuery插件之验证控件jquery.validate.js
查看>>
[经验]无线鼠标和无线键盘真的不能用了?——雷柏的重生之路~
查看>>
【转】plist涉及到沙盒的一个问题
查看>>
GNU make manual 翻译( 一百四十五)
查看>>
重构之美-走在Web标准化设计的路上[复杂表单]3 9 Update
查看>>
linux中的优先搜索树的实现--prio_tree【转】
查看>>
转载: 打造自己的asp.net验证控件
查看>>
重构之美-跨越Web标准,触碰语义网[开门见山:Microformat]
查看>>
git入门与实践【转】
查看>>
WPF 虚拟键盘
查看>>
储存卡无法打开专家教您怎么数据恢复
查看>>
彼得原理
查看>>
如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
查看>>