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根据文件大小打log日志
Oct 09 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
Python2包含中文报错的解决方法
Jul 09 Python
使用tensorflow实现线性svm
Sep 07 Python
浅谈python写入大量文件的问题
Nov 09 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
iPython pylab模式启动方式
Apr 24 Python
python打包生成so文件的实现
Oct 30 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 Python
如何利用python创作字符画
Jun 25 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跳转页面的几种实现方法详解
2013/06/08 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
Numpy数组转置的两种实现方法
2018/04/17 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
python实现对变位词的判断方法
2020/04/05 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
本科生个人求职自荐信
2013/09/26 职场文书
艺术爱好者的自我评价分享
2013/10/08 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
建筑公司文秘岗位职责
2013/11/29 职场文书
给朋友的道歉信
2014/01/09 职场文书
学生党支部先进事迹
2014/02/04 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书