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 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
详谈python http长连接客户端
Jun 12 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
Python通过Pygame绘制移动的矩形实例代码
Jan 03 Python
python通过paramiko复制远程文件及文件目录到本地
Apr 30 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 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中将汉字转换成拼音的函数代码
2012/09/08 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
javascript 操作符(~、&、|、^、)使用案例
2014/12/31 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
JS实现简易计算器
2020/02/14 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
基于Python log 的正确打开方式
2018/04/28 Python
python删除文本中行数标签的方法
2018/05/31 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
init进程的作用
2012/04/12 面试题
最新党员的自我评价分享
2013/11/04 职场文书
季度思想汇报
2014/01/01 职场文书
家长会欢迎标语
2014/06/24 职场文书
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
商铺门面租房协议书
2014/10/21 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
工作态度怎么写
2015/06/25 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
Python极值整数的边界探讨分析
2021/09/15 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis