Python中Subprocess的不同函数解析


Posted in Python onDecember 10, 2019

以前我一直用os.system()处理一些系统管理任务,因为我认为那是运行linux命令最简单的方式.
我们能从Python官方文档里读到应该用subprocess 模块来运行系统命令.subprocess模块允许我们创建子进程,连接他们的输入/输出/错误管道,还有获得返回值。
subprocess模块打算来替代几个过时的模块和函数,比如: os.system, os.spawn*, os.popen*, popen2.*命令。
让我们来看一下subprocess 有哪些不同的函数.

subprocess.call()

执行由参数提供的命令.

我们可以用数组作为参数运行命令,也可以用字符串作为参数运行命令(通过设置参数shell=True)

注意,参数shell默认为False

我们用subprocess.call()来做一个统计磁盘的例子:

subprocess.call(['df', '-h'])

下面的例子把shell设置为True

subprocess.call('du -hs $HOME', shell=True)

注意,python官方文档里对参数shell=True陈述了一个警告:

Invoking the system shell with shell=True can be a security hazard if combined
with untrusted input

现在,我们来看看输入与输出

Input and Output

subprocess 模块能阻止输出,当你不关心标准输出的时候是非常方便的.

它也使你通过一种正确的方式管理输入/输出,有条理地整合python脚本中的的shell命令.

Return Codes

通过subprocess.call的返回值你能够判定命令是否执行成功.
每一个进程退出时都会返回一个状态码,你可以根据这个状态码写一些代码。

stdin, stdout and stderr

在使用subprocess 时,有一个微妙的部分是怎么使用管道把命令连接起来.

管道表明一个新的子管道应该被创建.

默认的设置为None,意味着没有重定向发生

标准错误可以指向标准输出,表明子进程的错误信息会被捕获到和标准输出同一个文件.

subprocess.Popen()

subprocess 模块中基本的进程创建和管理由Popen 类来处理.

subprocess.popen是用来替代os.popen的.

我们来做一些真实的例子,subprocess.Popen需要一个数组作为参数:

import subprocess
p = subprocess.Popen(["echo", "hello world"], stdout=subprocess.PIPE)
print p.communicate()
>>>('hello world
', None)

注意,虽然你可以使用 "shell=True",但并不推荐这样的方式.

如果你知道你只用几个有限的函数,比如Popen和PIPE,你可以单单指定这几个函数:

from subprocess import Popen, PIPE
p1 = Popen(["dmesg"], stdout=PIPE)
print p1.communicate()

Popen.communicate()

communicate()函数返回一个tuple(标准输出和错误).

Popen.communicate() 和进程沟通:发送数据到标准输入.从标准输出和错误读取数据直到遇到结束符.等待进程结束.

输入参数应该是一个字符串,以传递给子进程,如果没有数据的话应该是None.

基本上,当你用 communicate()函数的时候意味着你要执行命令了.

用subprocess写Ping程序

我们先问用户地址,然后用ping请求这个地址.

# Import the module
import subprocess

# Ask the user for input
host = raw_input("Enter a host to ping: ")  

# Set up the echo command and direct the output to a pipe
p1 = subprocess.Popen(['ping', '-c 2', host], stdout=subprocess.PIPE)

# Run the command
output = p1.communicate()[0]

print output

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中enumerate的用法实例解析
Aug 18 Python
python实现删除文件与目录的方法
Nov 10 Python
Python实现简易Web爬虫详解
Jan 03 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
python分布式计算dispy的使用详解
Dec 22 Python
使用python求解二次规划的问题
Feb 29 Python
通过实例解析python创建进程常用方法
Jun 19 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
Python爬取梨视频的示例
Jan 29 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 #Python
python 视频逐帧保存为图片的完整实例
Dec 10 #Python
python 实现视频 图像帧提取
Dec 10 #Python
python-视频分帧&多帧合成视频实例
Dec 10 #Python
python实现视频读取和转化图片
Dec 10 #Python
sklearn-SVC实现与类参数详解
Dec 10 #Python
使用pandas 将DataFrame转化成dict
Dec 10 #Python
You might like
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
基于Python实现文件大小输出
2016/01/11 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python求最大连续子数组的和
2018/07/07 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
如何把python项目部署到linux服务器
2020/08/26 Python
Python绘制数码晶体管日期
2021/02/19 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
护士长竞聘书
2014/03/31 职场文书
生物科学专业自荐书
2014/06/20 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
校长师德表现自我评价
2015/03/04 职场文书
2015年采购部工作总结
2015/04/23 职场文书
Sql Server之数据类型详解
2022/02/28 SQL Server
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python