资讯专栏INFORMATION COLUMN

Python中的Subprocess模块

marek / 1052人阅读

摘要:以前我一直用处理一些系统管理任务因为我认为那是运行命令最简单的方式我们能从官方文档里读到应该用模块来运行系统命令模块允许我们创建子进程连接他们的输入输出错误管道,还有获得返回值。模块打算来替代几个过时的模块和函数,比如命令。

以前我一直用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",但并不推荐这样的方式.
如果你知道你只用几个有限的函数,比如PopenPIPE,你可以单单指定这几个函数:

from subprocess import Popen, PIPE

p1 = Popen(["dmesg"], stdout=PIPE)

print p1.communicate()
Popen.communicate()

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

subprocessPing程序

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

译自

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38600.html

相关文章

  • 写了2年python,知道 if __name__ == '__main__'

    摘要:原因很简单,因为中的代表的就是当前执行的模块名。缺点就是主程序会受待执行程序的影响,会出现待执行程序中抛异常或主动退出会导致主程序也退出的尴尬问题。总结来说就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。 showImg(https://segmentfault.com/img/remote/1460000018607395?w=502&h=318); 相信刚接触Pytho...

    wangbinke 评论0 收藏0
  • python中使用subprocess批量执行linux下命令

    摘要:可以执行命令的相关模块和函数有废弃废弃废弃,中被移除以上执行命令的相关的模块和函数的功能均在模块中实现,并提供了更丰富的功能。所以不能将设置为同时重定向子进程的标准输入输出与错误。同上用于设置子进程的当前目录用于指定子进程的环境变量。 可以执行shell命令的相关模块和函数有: os.system os.spawn os.popen --废弃 popen --废弃...

    Awbeci 评论0 收藏0
  • python模块subprocess模块级方法

    摘要:参数将作为子进程的标准输入传递给方法,必须是需要指定或参数,或者设置为或类型。源码模块还提供了版本中模块的相关函数。实际上是调用函数,在中执行类型的指令,返回形式的元组,包含和是使用解码的字符串,并删除了结尾的换行符。 subprocess.run() 运行并等待args参数指定的指令完成,返回CompletedProcess实例。 参数:(*popenargs, input=None...

    gitmilk 评论0 收藏0
  • python模块subprocess类与常量

    摘要:限于,可选的文件描述符序列,用于在父子进程间保持开放。如果设置了,表示派生的进程号子进程返回码,表示进程未终止。如果未捕获标准错误返回方法如果非,抛出异常异常模块的异常基类子进程执行超时。 常量 subprocess.DEVNULL:可传递给stdin, stdout, stderr参数的特殊值,意味着将使用特殊文件os.devnull重定向输入输出 subprocess.PIPE:可...

    Alan 评论0 收藏0
  • python执行shell命令的方法

    摘要:执行命令的方法模块方式说明这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回。返回值是依赖于系统的,直接返回系统的调用返回值,所以和是不一样的。并能够获得新建进程运行的返回状态。使用模块的目的是替代等旧的函数或模块。 python执行shell命令的方法 os模块 os.system方式: import os os.system(top) os.system(cat /proc...

    PumpkinDylan 评论0 收藏0

发表评论

0条评论

marek

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<