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实现全局变量的两个解决方法
Jul 03 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
Django model序列化为json的方法示例
Oct 16 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
python批量处理文件或文件夹
Jul 28 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
浅谈Python numpy创建空数组的问题
May 25 Python
Python基于百度AI实现抓取表情包
Jun 27 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 咖啡文化
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
Smarty模板语法详解
2019/07/20 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
在javascript中关于节点内容加强
2013/04/11 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
Django model 中设置联合约束和联合索引的方法
2019/08/06 Python
Python守护进程实现过程详解
2020/02/10 Python
tensorflow多维张量计算实例
2020/02/11 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
python中四舍五入的正确打开方式
2021/01/18 Python
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
运动会解说词100字
2014/01/31 职场文书
信息技术培训感言
2014/03/06 职场文书
武夷山导游词
2015/02/03 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
学校教代会开幕词
2016/03/04 职场文书
会议主持词通用版
2019/04/02 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js