python常用模块-调用系统命令模块(subprocess)
python常用模块-调用系统命令模块(subprocess)
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
subproces基本上就是为了取代os.system和os.spawn*模块的。当我们需要调用系统命令的时候,最险考虑的os模块。用os.system()和os.popen()来进行操作。但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出,判断该命令的运行状态,管理多个命令的并行等等。这时subprocess中的popen命令就能有效的完成我们需要的操作。
subprocess模块允许一个进程创建一个新的子进程,通过管道连接到子进程的stdin/stdout/stderr,获取子进程的返回值等操作。这个模块只是一个类:popen。
一.初识subprocess
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com import subprocess cmd = subprocess.Popen("ping www.baidu.com",shell=True) #开启新的进程,执行“dir”命令。shell=True关键字是运行将命令和参数写在一起, # cmd = subprocess.Popen(["ping","www.baidu.com"]) #如果不加shell=True关键字则需要将命令和参数分开写放在一个列表中。 cmd.wait() #需要等待上面开启的进程执行完毕才会继续执行下面的代码。 print("-"*50,"ending","-"*50) print(cmd.poll()) #查看子进程状态 cmd.kill() #终止子进程 # cmd.send_signal() #向子进程发送信号 cmd.terminate() #终止子进程。 print(cmd.pid ) #查看子进程号 #以上代码执行结果如需: ���� Ping www.baidu.com [61.135.169.125] ���� 32 �ֽڵ�����:
���� 61.135.169.125 �Ļظ�: �ֽ�=32 ʱ��=7ms TTL=57
���� 61.135.169.125 �Ļظ�: �ֽ�=32 ʱ��=3ms TTL=57
���� 61.135.169.125 �Ļظ�: �ֽ�=32 ʱ��=7ms TTL=57
���� 61.135.169.125 �Ļظ�: �ֽ�=32 ʱ��=4ms TTL=57 61.135.169.125 �� Ping ͳ����Ϣ:
���ݰ�: �ѷ��� = 4���ѽ��� = 4����ʧ = 0 (0% ��ʧ)��
�����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
��� = 3ms��� = 7ms��ƽ�� = 5ms
-------------------------------------------------- ending --------------------------------------------------
0
372
二.进程间通信-子进程的文本流控制
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com import subprocess cmd = subprocess.Popen("dir",shell=True,stdout=subprocess.PIPE) #将输出的内容传给“PIPE”,也就是我们常说的管道。 print(cmd.stdout.read().decode("gbk")) #将管道的内容读取出来。 #以上代码执行结果如下:
驱动器 E 中的卷是 应用程序存放处
卷的序列号是 FAFC-64CF E:\Code\pycharm\文件存放处\python学习笔记\Day12 的目录 2018/03/16 22:37 <DIR> .
2018/03/16 22:37 <DIR> ..
2018/03/16 19:59 816 1.configparser模块-创建文件.py
2018/03/16 20:07 1,150 2.读操作.py
2018/03/16 20:21 464 3.修改配置文件.py
2018/03/16 20:26 728 4.configparser删除的实例.py
2018/03/16 22:37 1,252 5.subprocess模块.py
2018/03/16 22:36 492 6.进程间通信-子进程的文本流控制.py
2018/03/16 20:26 141 cfg.ini
2018/03/15 21:38 82 上课地址:
8 个文件 5,125 字节
2 个目录 50,547,294,208 可用字节
三.subprocess.run实例
subprocess.run调用shell命令,只能保存执行后的状态,不能保存命令的执行结果!
#不含参数的调用linux命令的方法
>>> a = subprocess.run("df")
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 8854456 4170968 4227040 50% /
tmpfs 502172 228 501944 1% /dev/shm
/dev/sda1 289293 28463 245470 11% /boot #含参数的调用linux命令的方法
>>> a = subprocess.run(["df","-h"])
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 8.5G 3.8G 4.3G 48% /
tmpfs 491M 228K 491M 1% /dev/shm
/dev/sda1 283M 28M 240M 11% /boot
>>> #调用复杂的linux命令的方法,需要加“shell=True”,表示将前面引号的内容放在一个终端(terminal)去执行,需要注意的是这个不能保存命令输出的结果,而是保存命令执行的结果哟!一般非“0”就表示命令没有执行成功,而结果是“0”表示执行命令实成功的,但是命令的输出结果是无法保存的!切记!
>>> a = subprocess.run("df -h | grep /dev/sda1",shell=True)
/dev/sda1 283M 28M 240M 11% /boot
>>> a.returncode
0
四.subprocess.call与subprocess.check_call函数的调用方法
执行命令,返回命令的执行状态,“0” or 非 “0”。
#执行命令,返回命令执行状态 , 0 or 非0
>>> retcode = subprocess.call(["ls", "-l"])
total 96
-rw-------. 1 root root 3321 Oct 13 10:26 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Desktop
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Documents
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Downloads
-rw-r--r--. 1 root root 41433 Oct 13 10:26 install.log
-rw-r--r--. 1 root root 9154 Oct 13 10:24 install.log.syslog
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Music
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Pictures
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Public
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Templates
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Videos
>>> #执行命令,如果命令结果为0,就正常返回,否则抛异常
>>> subprocess.check_call(["ls", "-l"])
total 96
-rw-------. 1 root root 3321 Oct 13 10:26 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Desktop
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Documents
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Downloads
-rw-r--r--. 1 root root 41433 Oct 13 10:26 install.log
-rw-r--r--. 1 root root 9154 Oct 13 10:24 install.log.syslog
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Music
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Pictures
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Public
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Templates
drwxr-xr-x. 2 root root 4096 Oct 13 22:03 Videos
0
>>>
五.subprocess.getstatusoutput函数的调用方法
接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结果
>>> subprocess.getstatusoutput('ls /bin/pwd')
(0, '/bin/pwd')
>>>
六.subprocess.getoutput函数调用方法
接收字符串格式命令,并返回结果.
>>> subprocess.getoutput('ifconfig | grep eth0')
'eth0 Link encap:Ethernet HWaddr 00:0C:29:D4:DB:87 '
>>>
七.subprocess.check_output函数调用方法
执行命令,并返回结果,注意是返回结果,不是打印,下例结果返回给res.
>>> res=subprocess.check_output(['pwd'])
>>> res
b'/root\n'
>>>
八.subprocess.Popen函数用法
上面那些方法,底层都是封装的subprocess.Popen
>>> p = subprocess.Popen("df -h|grep /dev/sda1",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
>>> p.stdout.read()
b'/dev/sda1 283M 28M 240M 11% /boot\n'
>>>
“”“
注意:
我们来对第一行的进行讲解一下
subprocess.Popen表示打开一个终端(只是启动一个进程),stdin=subprocess.PIPE表示输入通过subprocess.PIPE这个管道传输,stdout=subprocess.PIPE表示输出也通过subprocess.PIPE这个管道传输,stderr=subprocess.PIPE同理。
”“”
九.检查命令是否执行完毕
1.poll()方法调用案例【不需要等】
>>> p = subprocess.Popen("top -bn 5",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
>>> p.poll()
>>> p.poll()
>>> p.poll()
>>> p.poll()
>>> p.poll()
>>> p.poll()
0
>>> p.poll()
0
>>>
‘’‘
poll()
Check if child process has terminated. Returns returncode
’‘’
2.wait()方法调用案例【需要等】返回执行状态
>>> p = subprocess.Popen("top -bn 5",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
>>> p.wait()
0
>>>
'''
wait()
Wait for child process to terminate. Returns returncode attribute.
'''
3.terminate()方法调用案例,直接杀掉启动进程
>>> p = subprocess.Popen("top -bn 5",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
>>> p.poll()
>>> p.terminate()
>>> p.poll()
143
'''
terminate() 杀掉所启动进程,此时p.poll返回值应该是非“0”,因为不是正常结束的!没有执行完毕就被杀掉了。
'''
4.communicate()函数调用方法
>>> p = subprocess.Popen("df -h;sleep 100",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
>>> p.poll()
>>> p.poll()
>>> p.communicate(timeout=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.5/subprocess.py", line 1068, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "/usr/local/lib/python3.5/subprocess.py", line 1699, in _communicate
self._check_timeout(endtime, orig_timeout)
File "/usr/local/lib/python3.5/subprocess.py", line 1094, in _check_timeout
raise TimeoutExpired(self.args, orig_timeout)
subprocess.TimeoutExpired: Command 'df -h;sleep 100' timed out after 2 seconds
>>>
‘’‘
communicate() 等待任务结束,我们需要在里面添加一个参数,默认单位是“s”,如果程序执行时间超过指定的时间就会抛出一个“TimeoutExpired”的字样哟,不过我们可以用异常处理来吧这个错误解决掉!
’‘’
5.preexec_fn参数调用案例
>>> def name():
... print("my name is yinzhengjie!")
...
>>> p = subprocess.Popen("pwd",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, preexec_fn=name) >>> p.stdout.read()
b'my name is yinzhengjie!\n/root\n'
>>> ‘’‘
preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用,运行结果见上例。
’‘’
6.cwd参数调用案例
>>> p = subprocess.Popen("pwd",cwd="/usr/local",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> p.stdout.read()
b'/usr/local\n'
>>>
'''
cwd:用于设置子进程的当前目录
'''
7.env参数调用案例
>>> p = subprocess.Popen("echo $name_str",cwd="/usr/local",shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,env={"name_str":"yinzhengjie"})
>>> p.stdout.read()
b'yinzhengjie\n'
>>>
‘’‘
提示:
env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
’‘’
python常用模块-调用系统命令模块(subprocess)的更多相关文章
- Python常用内置模块之xml模块
xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...
- python笔记之调用系统命令
python笔记之调用系统命令 目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数, ...
- 调用系统命令之subprocess模块
除了常见的os.system和os.popen方法,官方强烈推荐使用subprocess来调用系统命令. 这个库用起来其实很简单,按照惯例先贴一下官文关键点: The subprocess modul ...
- Python常用的内建模块
PS:Python之所以自称“batteries included”,就是因为内置了许多非常有用的模块,无需额外安装和配置,即可直接使用.下面就来看看一些常用的内建模块. 参考原文 廖雪峰常用的内建模 ...
- python模块:调用系统命令模块subprocess等
http://blog.csdn.net/pipisorry/article/details/46972171 Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻 ...
- python常用内置模块,执行系统命令的模块
Subprocess模块 python3.5将使用Subprocess模块跟操作系统进行交互,比如系统命令,他将替换 os.system os.spawn* subprocess.run()方法封装的 ...
- Python常用数据结构之collections模块
Python数据结构常用模块:collections.heapq.operator.itertools collections collections是日常工作中的重点.高频模块,常用类型由: 计数器 ...
- Python常用数据结构之heapq模块
Python数据结构常用模块:collections.heapq.operator.itertools heapq 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小 ...
- python常用函数库及模块巧妙用法汇总
在用python编写脚本或写程序过程中总要遇到一些对大文件或数据进行排序,计算,循环跌代等.我想下面这些函数库一定能用得到,总结如下:便于以后备查 列表去重(传说是列表去重最高效的方法): al = ...
随机推荐
- C语言学习之枚举类型
前言 枚举(enum)类型是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把 ...
- JavaScript 变量提升
变量提升(Hoisting):在ES6之前,函数声明和变量声明总是被JavaScript解释器隐式地提升(hoist)到包含他们的作用域的最顶端. 注意: 1. JavaScript 仅提升声明,而不 ...
- Flask学习-Flask基础之WSGI
一.WSGI为什么会出现? 在学习一个东西之前,我们肯定想知道:它为什么会出现?那么,WSGI为什么会出现呢? 我们知道,部署一个web应用,经常需要使用nginx.apache或者IIS等web服务 ...
- 《深入浅出NodeJS》mindmap
接触NodeJS有快两年了,但因为和我的工作内容关系不大,所以一直没有系统的学习.最近终于有空能系统地了解学习一下这门技术,于是买了一本朴灵老师的<深入浅出NodeJS>仔细研读.这本书内 ...
- IIS充当反向代理转发请求到Kestrel
接着上篇博文为ASP.NetCore程序启用SSL的code,这篇将介绍如何用IIS充当反向代理的角色转发请求到Kestrel服务器 介绍 与ASP.NET不同,ASP.netCore使用的是自托管w ...
- Netty源码分析(前言, 概述及目录)
Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...
- 基于神念TGAM的脑波小车(1)
作者声明:此博客是作者的毕设心得,拿来分享. 拿到模块,在网上查了一圈,发现基本没什么有用的资料,有也是一些废话,经过我几个月的攻克,现在已初步搞定,分享给大家. 废话不多说,直接步入正题. 这是通过 ...
- Win10 + vs2017 编译并配置tesseract4.1.0
tesseract 是一个开源的OCR (Optical Character Recognition , 光学字符识别) 引擎,本文就介绍一下自己在编译 tesseract4.1.0时遇到的一些坑,希 ...
- 机器学习初入门01-numpy的基础用法
一.numpy基础结构 1. numpy.genformtxt('路径名', delimiter = '分割符', dytype = 读取方式如str ):读取一个文件,返回一个numpy.ndarr ...
- 微软职位内部推荐-Service Engineer for Office365
微软近期Open的职位: Key Responsibilities: The Service Engineer in this team will be responsible for plannin ...