《python标准库》--subprocess <一、运行外部命令>

作用:创建附加进程,并与之通信。如果一个程序需要生产或利用文本,这个模块尤其有帮助,因为这个API支持通过新进程的标准输入和输出通道来回传递数据。

subprocess模块提供了一种一致的方法来创建和处理附加进程。与标准库中的其他模块相比,它提供了一个更高级的接口,用以替换os.system()、os.spawnv()、os和popen2模块中的popen()函数,以及commands()。

subprocess模块定义了一个类Popen,还定义了使用这个类的一些包装器函数。Popen的构造函数根据一些参数建立新进程,使父进程可以通过管道与之通信。相对于它替换的其他模块和函数,subprocess能提供其全部功能,甚至更多。对于所有情况,这个API用法都一致,很多需要开销的额外步骤(如关闭额外的文件描述符,以及确保管道关闭)都已“内置”,而不需要由应用代码单独处理。

要运行一个外部命令,但不采用os.system()的方式与之交互,可以使用call()函数。命令行参数作为一个字符串列表传入,这样就无须对引号或者其他可能由shell解释的特殊字符转义。

1 >>> import subprocess
2 >>> subprocess.call([‘ls‘,‘-l‘])
3 data
4 test.py
5 0
6 >>>

将shell参数设置为true值会使subprocess创建一个中间shell进程,由这个进程运行命令。默认情况下会直接运行命令。

>>> import subprocess
>>> subprocess.call(‘ls -l‘,shell=True)
总用量 52
drwxr-xr-x 2 root root 4096 8月   9 22:29 data
-rw-r--r-- 1 root root  469 8月   7 22:52 test.py
0
>>>

call()的返回值是程序的退出码。调用者要负责解释这个返回值来检测错误。check_call()函数的工作类似于call(),只不过除了检查退出码外,如果指示发生了一个错误,则会产生一个CalledProcesssError异常。

1 >>> import subprocess
2 >>> try:
3 ...     subprocess.check_call([‘false‘])
4 ... except subprocess.CalledProcessError as err:
5 ...     print ‘ERROR:‘,err
6 ...
7 ERROR: Command ‘[‘false‘]‘ returned non-zero exit status 1
8 >>> 

对于call()启动的进程,其标准输入和输出通道会绑定到父进程的输入和输出。这说明调用程序无法捕获命令的输出。可以使用check_output()捕获输出,以备以后处理。ls -l命令会成功运行,所以它打印到标准输出到文本会被捕获并返回。

 1 >>> import subprocess
 2 >>> output = subprocess.check_output([‘ls‘,‘-l‘])
 3 >>> print ‘Have %d bytes in output‘ % len(output)
 4 Have 822 bytes in output
 5 >>> print output
 6 总用量 56
 7 drwxr-xr-x 2 root root 4096 8月   9 22:29 data
 8 -rw-r--r-- 1 root root  469 8月   7 22:52 test.py
 9
10 >>>

下一个例子在一个子shell中运行一系列命令。在命令返回一个错误码并退出之前,消息会发送到标准输出和标准错误输出。发送到标准错误输出的消息会打印到控制台,不过发送到标准输出的消息会隐藏。

 1 >>> import subprocess
 2 >>> try:
 3 ...     output = subprocess.check_output(
 4 ...         ‘echo to stdout; echo to stderr 1>&2; exit 1‘,
 5 ...         shell=True,               #stderr=subprocess.STDOUT
 6 ...         )
 7 ... except subprocess.CalledProcessError as err:
 8 ...     print ‘ERROR:‘,err
 9 ... else:
10 ...     print ‘Have %d bytes in output‘ % len(output)
11 ...     print output
12 ...
13 to stderr #将check_output()中的stderr参数设置为常量STDOUT时,这句不会被输出。
14 ERROR: Command ‘echo to stdout; echo to stderr 1>&2; exit 1‘ returned non-zero exit status 1
15 >>> 
时间: 2024-10-16 17:21:50

《python标准库》--subprocess <一、运行外部命令>的相关文章

Python中subprocess 模块 创建并运行一个进程

python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" call(cmd, shell=True) 运行之后: 1:打开并浏览了test.txt文件 2:删除了test.txt文件 from subprocess import call import shlex cmd = &

python subprocess模块

转 http://blog.csdn.net/imzoer/article/details/8678029 subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen.可以使用Popen来创建进程,并与进程进行复杂的交互.它的构造函数如下: subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=

[ python编程 ] subprocess模块学习总结

转载:http://www.jb51.net/article/48086.htm 从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn*.os.popen*.popen2.*.commands.*不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息. 一.subprocess以及常用的封装函数    运行python的时候,我们都是在创建并

python子进程模块subprocess详解与应用实例 之三

二.应用实例解析 2.1 subprocess模块的使用 1. subprocess.call >>> subprocess.call(["ls", "-l"])  0  >>> subprocess.call("exit 1", shell=True)  1 2. 调用系统中cmd命令,显示命令执行的结果: x=subprocess.check_output(["echo", "

python子进程模块subprocess详解与应用实例 之二

1.2. Popen 对象 Popen类的实例有下列方法: 1. Popen.poll() 检查子进程是否已经结束,设置并返回返回码值. 2. Popen.wait() 等待子进程结束,设置并返回返回码值.WARNING: 当使用 stdout=PIPE 或 stderr=PIPE 并且子进程生成了足够多的输出信息到管道,以至于管道阻塞,将会造成死锁.         使用 communicate()可以避免这种情况. 3. Popen.communicate(input=None) 和子进程进

python 模块积累-----subprocess

subprocess subprocess模块介绍 subprocess是python创建子进程的工具,其实和c中的fork出一个子进程,然后在子进程中运行exec执行另外一个进程很类似. subprocess包中有很多方法创建子进程,这些函数创建子进程的行为不太一样,我们可以更具需求选择不同的方式来创建子进程. 使用subprocess包中的函数创建子进程的时候,要注意: 1) 在创建子进程之后,父进程是否暂停,并等待子进程运行. 2) 函数返回什么 3) 当returncode不为0时,父进

subprocess模块

subprocess模块 subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen.可以使用Popen来创建进程,并与进程进行复杂的交互. subprocess.Popen(...) 用于执行复杂的系统命令 参数: args:shell命令,可以是字符串或者序列类型(如:list,元组) bufsize:指定缓冲.0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲 stdin, stdout, stderr:分别表示程序的标准输入

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件

子进程管理模块subprocess

subprocess模块允许你生成子进程,连接管道,并获取返回的代码. 一.使用subprocess模块 模块中定义了一个Popen类:       subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=

Python用subprocess的Popen来调用系统命令

当我们须要调用系统的命令的时候,最先考虑的os模块.用os.system()和os.popen()来进行操作.可是这两个命令过于简单,不能完毕一些复杂的操作,如给执行的命令提供输入或者读取命令的输出,推断该命令的执行状态,管理多个命令的并行等等.这时subprocess中的Popen命令就能有效的完毕我们须要的操作.在这里对Popen予以简介. 以下是一个非常easy的样例,来自Python的官网教程:http://docs.python.org/library/subprocess.html