以前我一直用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设置为Truesubprocess.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, PIPEp1 = Popen(["dmesg"], stdout=PIPE)print p1.communicate()

Popen.communicate()

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

Popen.communicate()和进程沟通:发送数据到标准输入.从标准输出和错误读取数据直到遇到结束符.等待进程结束.

输入参数应该是一个字符串,以传递给子进程,如果没有数据的话应该是None.

基本上,当你用communicate()函数的时候意味着你要执行命令了.

用subprocess写Ping程序

我们先问用户地址,然后用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

python subprocess communicate_Python中的Subprocess模块相关推荐

  1. Python使用datetime中的timedelta模块实现时间增减:python计算100天后是哪年那月那日?

    Python使用datetime中的timedelta模块实现时间增减:python计算100天后是哪年那月那日? 目录

  2. 细数python标准库中低调的模块

    有没有遇到过这种情况,在网络上搜索如何使用Python进行某种操作,最终找到一个第三方库,直到后来发现标准库中包含的模块或多或少都可以满足你的需求.这种情况并不罕见, 整理了一些python标准库中鲜 ...

  3. Python os模块 -Python系统编程中的操作模块

    Python os模块 -Python系统编程中的操作模块 用途:处理(文件与目录)操作 以下为简单的常用操作 import os 导入os模块 help(os) 查看os模块帮助文档 os.name ...

  4. python os popen_python中的subprocess.Popen()使用详解

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  5. 在Ubuntu 16.04.5 LTS上利用python 2.7中的PIL模块智能等比例压缩过大的图片集实操

    需求 有时候自媒体创作写稿时难免遇到大规模压缩某个文件夹内的图片的情况,通常我们可以使用一些批量压缩的工具来处理,但我觉得,这是小白的做法,对于我们这些经验丰富的老司机来说,使用代码来处理,将是一件高 ...

  6. python大型项目中的日志模块_Python中日志模块的使用

    前言 程序和脚本往往是无人值守运行的,一旦发生问题,就需要我们去追溯当时的情况来定位问题的原因. 这便需要我们在程序和脚本中引入日志的功能. 相比于print信息,使用logging日志有以下优点 可 ...

  7. Python标准库中的marshal模块

     marshal-内部的Python对象序列化 该模块包含可以以二进制格式读取和写入Python值的函数.该格式是针对Python的,但独立于机器架构问题(例如,您可以将Python值写入PC上的 ...

  8. Python标准库中的pickle模块

     pickle  -  Python对象序列化. pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议."pickle"是将Python对象层次结构转换为 ...

  9. Python标准库中的os模块

     Python的标准库中的os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux ...

最新文章

  1. Java项目:仿天猫网上商城项目(java+jsp+servlet+mysql+ajax)
  2. configparser模块
  3. [YTU]_2922(Shape系列-8)
  4. 推荐 2 个用 VS Code 直接浏览 GitHub 代码!只需要 1s !
  5. 60+ 安全厂商的选择,为何 TA 一直坚持做威胁情报供应商?
  6. python打开控制台运行_如何在IPython控制台中默认运行文件而不是终端?
  7. python模拟微信投票_python 模拟微信投票
  8. 《Unix编程艺术》读书笔记(1)
  9. 注册会计师怎么注册非执业?注会执业与非执业有何区别
  10. swift 使用Moya进行网络请求
  11. Xilinx zynq EtherCAT LAN9252
  12. [BJOI2019] 排兵布阵(分组背包)
  13. oracle wallet,Oracle Wallet的使用
  14. 微信扫码登录功能实现
  15. pandas将dataframe的所有数据列的名称转化为大写形式(all column labels in dataframe to uppercase)
  16. 移动端界面设计之尺寸篇
  17. 远期、期货和互换(三)
  18. 每周推荐短视频:为什么理论正确但得不到预期结果?
  19. Exchange2010批量删除邮件
  20. 用matlab计算雅可比矩阵

热门文章

  1. linux我如何查看一个脚本的路径,linux获取shell脚本所在绝对路径操作介绍
  2. 2003 r2 64 iis php mysql_关于在win2003中,iis+php+mysql 配置的问题
  3. python中列表如何比较大小_如何比较python中的列表/列表?
  4. excel vba 调用webbrowser_VBA 公式与函数
  5. tcp 三次握手,四次挥手
  6. 常用的几种卷积神经网络介绍
  7. php pdo操作mysql_PHP操作数据库详细(PDO)
  8. C中不能直接比较两个double类型
  9. Docker swarm 实战-部署wordpress
  10. Oracle shared server模式连接ORA-12519