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中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
解决pycharm界面不能显示中文的问题
May 23 Python
python 根据时间来生成唯一的字符串方法
Jan 14 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
python isinstance函数用法详解
Feb 13 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
进行数据处理的6个 Python 代码块分享
Apr 06 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实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
PHP创建XML接口示例
2019/07/04 PHP
php实现映射操作实例详解
2019/10/02 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
初步理解Python进程的信号通讯
2015/04/09 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
初中班主任评语大全
2014/04/24 职场文书
幼师自荐信范文
2015/03/06 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
担保书范文
2019/07/09 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技