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 PIL模块与随机生成中文验证码
Feb 27 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
python中nan与inf转为特定数字方法示例
May 11 Python
python3 读写文件换行符的方法
Apr 09 Python
对pandas中to_dict的用法详解
Jun 05 Python
python之mock模块基本使用方法详解
Jun 27 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
Python turtle画图库&&画姓名实例
Jan 19 Python
Python阶乘求和的代码详解
Feb 14 Python
python实现udp聊天窗口
Mar 31 Python
Python grpc超时机制代码示例
Sep 14 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 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写杨辉三角实例代码
2011/07/17 PHP
深入PHP数据加密详解
2013/06/18 PHP
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
ES5学习教程之Array对象
2017/04/01 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
Python类的专用方法实例分析
2015/01/09 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python SQLite3简介
2018/02/22 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
Python数据可视化之画图
2019/01/15 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
怎样创建、运行java程序
2014/08/01 面试题
2014年党课学习心得体会
2014/07/08 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android