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模块restful使用方法实例
Dec 10 Python
python使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
在Python程序中实现分布式进程的教程
Apr 28 Python
python中global用法实例分析
Apr 30 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
django使用html模板减少代码代码解析
Dec 12 Python
python 分离文件名和路径以及分离文件名和后缀的方法
Oct 21 Python
python安装scipy的步骤解析
Sep 28 Python
python创建子类的方法分析
Nov 28 Python
Python如何读写二进制数组数据
Aug 01 Python
python二维图制作的实例代码
Dec 03 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
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
php防攻击代码升级版
2010/12/29 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
Python读写docx文件的方法
2018/05/08 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
python re.match()用法相关示例
2021/01/27 Python
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
易程科技软件测试笔试
2013/03/24 面试题
EJB3推出JPA的原因
2013/10/16 面试题
教师通用专业自荐书范文
2014/02/11 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
nginx中proxy_pass各种用法详解
2021/11/07 Servers