Python中的Subprocess模块

网站编辑2022-01-20 16:34:45257

  以前我一直用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, 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

最新推荐

右侧广告图1
  • 负载均衡

    负载均衡SLB是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。

    ¥0.04/小时

    实例5折带宽8折

  • 智能对话分析

    智能对话分析帮助企业从海量对话录音或对话文本中挖掘可能存在的风险点和商机,同时提升企业服务质量、监控舆情风险、优化服务策略,典型应用场景有智能客服质检、销售线索分析等。

    ¥350.00/月

    年中优惠

  • 号码认证服务

    升级传统短信验证方式。号码认证服务直连三大运营商,在用户无感知过程中实现基于手机号码一键登录或认证,优化注册/登录等场景验证流程。推出融合认证解决方案,一次集成,支持多认证方式(一键登录、短信认证、图形认证)。自动优选认证方案,短信兜底保障安全。

    ¥34.85/年

    年中优惠

右侧广告图2