博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中的Subprocess模块
阅读量:7154 次
发布时间:2019-06-29

本文共 1910 字,大约阅读时间需要 6 分钟。

以前我一直用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 subprocessp = subprocess.Popen(["echo", "hello world"], stdout=subprocess.PIPE)print p.communicate()>>>('hello world', None)

注意,虽然你可以使用 "shell=True",但并不推荐这样的方式.

如果你知道你只用几个有限的函数,比如PopenPIPE,你可以单单指定这几个函数:

from subprocess import Popen, PIPEp1 = Popen(["dmesg"], stdout=PIPE)print p1.communicate()

Popen.communicate()

communicate()函数返回一个tuple(标准输出和错误).

Popen.communicate() 和进程沟通:发送数据到标准输入.从标准输出和错误读取数据直到遇到结束符.等待进程结束.
输入参数应该是一个字符串,以传递给子进程,如果没有数据的话应该是None.
基本上,当你用 communicate()函数的时候意味着你要执行命令了.

subprocessPing程序

我们先问用户地址,然后用ping请求这个地址.

# Import the moduleimport subprocess# Ask the user for inputhost = raw_input("Enter a host to ping: ")    # Set up the echo command and direct the output to a pipep1 = subprocess.Popen(['ping', '-c 2', host], stdout=subprocess.PIPE)# Run the commandoutput = p1.communicate()[0]print output

转载地址:http://vbogl.baihongyu.com/

你可能感兴趣的文章
联合查询(查找所有分类及其父类)
查看>>
JSTL判断list的size()大小
查看>>
谁说技术男没有人文情怀:当旅途遇到生命赞歌
查看>>
Implement Queue using Stacks(用栈实现队列)
查看>>
从终端获取一个字符串,分别统计当中大写字母、小写字母、数字及其他字符的个数。...
查看>>
leetCode(51):Valid Palindrome
查看>>
React进阶之高阶组件
查看>>
(一一六)新浪微博client的离线缓存实现思路
查看>>
Win10 Docker 安装使用
查看>>
JavaScriptSerializer 类
查看>>
C# 如何创建Excel多级分组
查看>>
VLAN原理
查看>>
Windows查看所有的端口及端口对应的程序
查看>>
点击按钮后弹出相应的颜色值
查看>>
MySQL--BNL/ICP/MRR/BKA
查看>>
systemctl 命令
查看>>
CentOS的epel源rpm最新下载地址获取技巧
查看>>
java 读取项目外面配置文件的方法
查看>>
WPF 窗体基类实现的体验及实现回车到下一控件
查看>>
转)深入理解HTTP消息头
查看>>