博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python subprocess模块
阅读量:6983 次
发布时间:2019-06-27

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

subprocess模块

允许你生成一个或多个进程,并且可以跟它交互,并且获取返回的结果,这个模块想要替换掉几个老的方法:        os.system        os.spawn*        所以以后跟系统交互的命令,尽量用subprocess建议调用subprocess的run()方法去跟系统进行调用,更高级的方法,使用popen() ;run()方法其实就是封装的popen。run()方法在python3.5才有,python2.x没有,2.x用subprocess.call(),当然python3.X版本也支持call()

常见的subprocess方法

subprocess.call    subprocess.call("df -lh",shell=True) 或者 subprocess.call(["df","-lh"])    如果想获取到执行内容:         a = subprocess.Popen("df -lh",shell=True,stdout=subprocess.PIPE)         a.stdout.read()subprocess.check_call    执行命令,如果执行状态码是 0 ,则返回0,否则抛异常    subprocess.check_call(["ls","-l"])    subprocess.check_call("exit 1",shell=True)   抛出异常:subprocess.CalledProcessError:subprocess.check_output    执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常    subprocess.check_output(["echo","hello world!"])    返回:'hello world!\n'    subprocess.check_output("exit 1",shell=True)        剖出异常:subprocess.CalledProcessError    执行命令,并返回结果,注意是返回结果,不是打印,下例结果返回给res    res = subprocess.getoutput("ls /bin/sh")    res     输出:'/bin/sh'subprocess.getstatusoutput    接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结果    subprocess.getstatusoutput("ls /bin/ls")        返回:(0, '/bin/ls')subprocess.getoutput    接收字符串格式命令,并返回结果    subprocess.getoutput("ls /bin/ls")      返回:'/bin/ls'

上边的subprocess方法,底层都是封装的subprocessPopen

subprocess的其他解说:

poll()    Check if child process has terminated. Returns returncodewait()    Wait for child process to terminate. Returns returncode attribute.terminate() 杀掉所启动进程communicate() 等待任务结束stdin 标准输入stdout 标准输出stderr 标准错误pid    The process ID of the child process.Popen例子:    p = subprocess.Popen("df -lh|grep root",stdin=subproce    p.stdout.read()     输出:b'/dev/mapper/cl-root   38G  5.7G   32G  16% /\n'

run()方法的使用:

subprocess.run(["ls","-lh"])    subprocess.run("exit 1",shell=True,check=True)  抛出异常:subprocess.CalledProcessError    subprocess.run(["ls","-l","/dev/null"],stdout=subprocess.PIPE) 输出:    如下:CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw-. 1 root root 1, 3 Jan  3 11:16 /dev/null\n')调用和系统之间的操作,推荐subprocess.run() ,因为它迟早要替换掉sys.system ;run()方法可以满足大部分的需求,如果要进行一些复杂的交互的话,还可以用subprocessPopen()如:    p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} \;",shell=True,stdout=subprocess.PIPE)    print (p.stdout.read())    输出:b'0 -r--------. 1 root root 128T Jan 23 14:58 /proc/kcore\n1.9G -rw-------. 1 root root 100G Jan  8 17:48 /var/lib/docker/devicemapper/devicemapper/data\n3.8M -rw-------. 1 root root 2.0G Jan  8 17:48 /var/lib/docker/devicemapper/devicemapper/metadata\n'

subprocess.Popen(...)

用于执行复杂的系统命令    参数:    args:shell命令,可以是字符串或者序列类型(如:list,元组)    bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲    stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄    preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用    close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。    所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。    shell:同上    cwd:用于设置子进程的当前目录    env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。    universal_newlines:不同系统的换行符不同,True -> 同意使用 \n    startupinfo与createionflags只在windows下有效    将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等终端输入的命令分为两种:    输入即可得到输出:如 ifocnfig    输入进行某环境,依赖某环境再输入:如 python需要交互的命令示例:    import subprocess    obj = 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("timeout=10")    print out_error_list    输出:        ('', '  File "
", line 2\n print 2 \n ^\nIndentationError: unexpected indent\n')subprocess实现iptables 清规则的时候 sudo 自动输入密码 import subprocess def mypass(): mypass = '123' # or get the password from anywhere return mypass echo = subprocess.Popen(['echo', mypass()], stdout=subprocess.PIPE, ) sudo = subprocess.Popen(['sudo', '-S', 'iptables', '-L'], stdin=echo.stdout, stdout=subprocess.PIPE, ) end_of_pipe = sudo.stdout print ("Password ok \n Iptables Chains %s" % end_of_pipe.read())

转载于:https://blog.51cto.com/506554897/2064605

你可能感兴趣的文章
用JSP实现学生查询
查看>>
企业网站怎么建设
查看>>
数据库和MySQL相关面试题目
查看>>
Yii 框架学习--01 框架入门
查看>>
All Things OpenTSDB
查看>>
android 网络通信框架volly
查看>>
二分查找算法及其变种
查看>>
一个泛型冒泡排序的实现
查看>>
大型分布式网站架构设计与实践 第一章《面向服务的体系架构(SOA)》
查看>>
[From OpenBSD Man Page]PFSYNC
查看>>
hdu 5131 Song Jiang's rank list 【2014ACM/ICPC亚洲区广州站-重现赛】
查看>>
JS笔记(20): JS中的同步编程和异步编程
查看>>
那几个题(没懂的地方留言)
查看>>
如何改变UITableViewCell的选中样式(颜色)?storyboard上cell的selection不可用?
查看>>
Ubuntu 怎么增加根目录 大小
查看>>
Spring Cloud微服务分布式云架构—集成项目简介
查看>>
盒马鲜生颠覆传统生鲜市场的胜算几何?
查看>>
【Node】常用基础 API 整理
查看>>
传神成进博会唯一指定智能翻译硬件提供商 力助无障碍沟通
查看>>
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
查看>>