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中Django框架下的staticfiles使用简介
May 30 Python
微信跳一跳python代码实现
Jan 05 Python
TensorFlow实现Batch Normalization
Mar 08 Python
python如何定义带参数的装饰器
Mar 20 Python
python实现飞机大战
Sep 11 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
python实现三壶谜题的示例详解
Nov 02 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
python人工智能human learn绘图可创建机器学习模型
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 Ctemplate引擎开发相关内容
2012/03/03 PHP
PHP关联链接常用代码
2012/11/05 PHP
php调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
日期 时间js控件
2009/05/07 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
Python csv文件记录流程代码解析
2020/07/16 Python
python中字典增加和删除使用方法
2020/09/30 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
应用心理学个人的求职信
2013/12/08 职场文书
自我评价是什么
2014/01/04 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
会计顶岗实习心得
2014/01/25 职场文书
人力资源主管职责范本
2014/03/05 职场文书
小学教师师德承诺书
2014/05/23 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
python状态机transitions库详解
2021/06/02 Python