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中正则表达式的使用方法
Feb 25 Python
python调用OpenCV实现人脸识别功能
May 25 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 Python
Python中pymysql 模块的使用详解
Aug 12 Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
python opencv通过4坐标剪裁图片
Jun 05 Python
如何使用python包中的sched事件调度器
Apr 30 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中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
php短信接口代码
2016/05/13 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
PHP反射学习入门示例
2019/06/14 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
js类中的公有变量和私有变量
2008/07/24 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
使用python实现扫描端口示例
2014/03/29 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
解决uWSGI的编码问题详解
2017/03/24 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
django表单的Widgets使用详解
2019/07/22 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
中学生运动会入场词
2014/02/12 职场文书
2015感人爱情寄语
2015/02/26 职场文书
爱心捐助活动总结
2015/05/09 职场文书
人代会简报
2015/07/21 职场文书
python小型的音频操作库mp3Play
2022/04/24 Python