赞
踩
subprocess库详解
2018-03-16T07:14:03
1794
0
0
#### subprocess模块允许你产生新的进程,连接到他们的输入/输出/错误管道,并获得他们的返回代码。
#### 它是以下几个原有模块的整合和优化:
#### os.system
#### os.spawn*
#### os.popen*
#### popen2.*
#### commands.*
## call
目前,subprocess模块是一种推荐的方式用于启动一个子进程。
首先,我们来了解一下最基本的命令`call`。
```python
subprocess.call(args, stdin=None, stdout=None, stderr=None, shell=False)
```
示例:
```python
subprocess.call(["ls", "-lrt"])
```
该命令会执行`ls -lrt`命令,同时返回运行结果码。当返回0时表示运行成功。
## Popen
下面,我们来详细了解一下Popen函数的使用。
Popen函数的调用方式类似于call,但是对输入、输出、错误输出的管理和查询能力更强。
```python
subprocess.Popen(args, stdin=None, stdout=None, stderr=None, shell=False, cwd="")
```
- shell默认为False,当shell为False时,args需要传入的数组形式的命令;而当shell为True时,args需要传入的则为shell字符串。
- cwd可以指定工作目录,默认为当前目录。
- stdout和stderr可以设置为subprocess.PIPE,从而可以读取输出信息和异常信息。
下面,我们通过几个简单的Case来更加具体的了解一下subprocess模块的使用。
假设我们在`/home/nianshi`目录下有两个文件:
`test1.py`:
```python
print "nianshi0912"
```
`test2.py`:
```python
print nianshi0912
```
很明显,启动`test1.py`是一个可以正常执行的文件,而`test2.py`则存在语言错误,无法正常执行。
下面,我们来使用subprocess.Popen函数来分别运行一下这两个文件:
```python
import subprocess
obj = subprocess.Popen("python test1.py", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd="/home/nianshi")
return_code = obj.wait()
print return_code
# 0
print a.stdout.read()
# nianshi0912
print a.stderr.read()
#
```
其中,我们可以看到我们在subprocess.Popen函数中指定了运行代码的文件,并指定了代码运行目录,同时设置了输出和异常输出。
然后,通过调用wait()函数等到命令执行完成并获取到了返回值。
其中,返回值0表示运行成功,返回值1表示运行失败。
接下来,我们可以通过stdout.read()来读取运行过程中打印的信息。
也可以通过stderr.read()来读取运行过程中打印的错误信息。
下面,我们来运行一段会产生错误的代码来实践一下吧:
```python
import subprocess
obj = subprocess.Popen("python test2.py", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd="/home/nianshi")
return_code = obj.wait()
print return_code
# 1
print a.stdout.read()
# nianshi0912
print a.stderr.read()
# Traceback (most recent call last):
# File "test2.py", line 1, in # print nianshi0912
# NameError: name 'nianshi0912' is not defined
```
0条评论
评论前请先登录
登录
注册
发表回复
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。