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 相关文章推荐
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
编写自定义的Django模板加载器的简单示例
Jul 21 Python
最大K个数问题的Python版解法总结
Jun 16 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
python利用正则表达式提取字符串
Dec 08 Python
Python日期的加减等操作的示例
Aug 15 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
Python zip()函数用法实例分析
Mar 17 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python中remove函数的踩坑记录
Jan 04 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
javascript URL编码和解码使用说明
2010/04/12 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
python中__slots__用法实例
2015/06/04 Python
python编写简单爬虫资料汇总
2016/03/22 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Django logging配置及使用详解
2019/07/23 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
新闻专业应届生求职信
2013/10/31 职场文书
营销与策划应届生求职信
2013/11/04 职场文书
音乐器材管理制度
2014/01/31 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
普通话宣传标语
2014/06/26 职场文书
环卫工人慰问信
2015/02/15 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
深入理解go slice结构
2021/09/15 Golang
python manim实现排序算法动画示例
2022/08/14 Python