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 实现文件的递归拷贝实现代码
Aug 02 Python
Python生成验证码实例
Aug 21 Python
python中引用与复制用法实例分析
Jun 04 Python
python 文件操作删除某行的实例
Sep 04 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
全面分析Python的优点和缺点
Feb 07 Python
python读取Excel实例详解
Aug 17 Python
python配置grpc环境
Jan 01 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
python实现程序重启和系统重启方式
Apr 16 Python
Python中tqdm的使用和例子
Sep 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
JAVA/JSP学习系列之六
2006/10/09 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php银联网页支付实现方法
2015/03/04 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
Python中的集合介绍
2019/01/28 Python
Python3并发写文件与Python对比
2019/11/20 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
django form和field具体方法和属性说明
2020/07/09 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
英语师范专业毕业生自荐信
2013/09/21 职场文书
合作经营协议书
2014/04/17 职场文书
公司总经理任命书
2014/06/05 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
开业典礼致辞
2015/07/29 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL