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 pyinotify日志监控系统处理日志的方法
Mar 08 Python
解决python爬虫中有中文的url问题
May 11 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
Sanic框架Cookies操作示例
Jul 17 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
对Python 内建函数和保留字详解
Oct 15 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
Python3远程监控程序的实现方法
Jul 15 Python
python将时分秒转换成秒的实例
Dec 07 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 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实现文件下载断点续传详解
2014/10/15 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
Python 除法小技巧
2008/09/06 Python
python函数参数*args**kwargs用法实例
2013/12/04 Python
gearman的安装启动及python API使用实例
2014/07/08 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
python批量修改文件编码格式的方法
2018/05/31 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
Python使用贪婪算法解决问题
2019/10/22 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
EJB timer的种类
2014/10/28 面试题
元旦红领巾广播稿
2014/02/19 职场文书
感恩节活动策划方案
2014/05/16 职场文书
婚前协议书范本
2014/10/27 职场文书
财务经理岗位职责
2015/01/31 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
Java spring单点登录系统
2021/09/04 Java/Android
浅谈如何保证Mysql主从一致
2022/03/13 MySQL