python中的subprocess库_subprocess库详解

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条评论

评论前请先登录

登录

注册

发表回复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值