Python调用linux系统命令--使用subprocess模块
2016-10-17 00:56
393 查看
在python 中调用系统命令,如果使用subprocess.Popen() 模块,按照命令参数的的形式,可以分两种:
把命令当作字符串传给subprocess.Popen()
把命令保存到一个元组,list 的序列,再传给subprocess.Popen()
subprocess模块使用Popen类创建子进程执行命令,首先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=False, startupinfo=None, creationflags=0)
参数说明:
args: 被python执行的命令,一般使用字符串,或者序列(元组或者列表)的形式传入。如果args是一个元组或列表形式,序列的第一个元素就是命令的可执行文件。也可以使用executable 显式地指定可执行文件的路径。
stdin, stdout, stderr :用于和外部进行通信。可以使用 subprcess.PIPE 进行初始化。当stdin, stdout, stderr 被初始化后,就可以和外部进行复杂的通信了。
如:
p = subprocess.Popen() 创建了子进程p 执行命令,外部需要给命令传入参数,则可以用p.communicate(stdin_some)方法,将stdin_some 传入p.stdin 标准输入。
同时p.commucincate() 返回一个tuple 值 (stdout_some, stderr_some) = p.communicate(stdin_some).所以,调用subprocess.Popen() 创建子进程执行命令,可以很方便地和子进程进行通信,获取状态。
注意:如果需要使用communication() 方法与子进程通信,那么在创建子进程时,stdin, stdout, stderr, 都需要用subprocess.PIPE 初始化。
shell : 默认是False, 如果args 的形式是字符串,那么shell=True, 指定命令是用shell 执行的。如果,args 的形式是一个元组或者list,那么shell=False, 指定不需要在shell 中执行命令。
env : 字典, 用于指定子进程的运行环境,默认是None, 说明子进程继承父进程的环境变量。
subprocess.Popen 的一些方法:
Popen.communicate() : 与外部通信,(out, errout) = Popen.communicate(), 返回标准输出和错误输出。
Popen.poll() : 检查子进程的状态,如果是None 则正在运行,如果是0 则退出,如果是-N 则异常退出。
Popen.wait() : 等待进程结束,并获得返回码。
Popen.pid : 返回进程pid 号
Popen.kill() : 杀死进程
举例:
1. 以字符串方式传入,shell=True:
![](http://s1.51cto.com/wyfs02/M01/88/FC/wKiom1gDp4-ChGwVAACOO7GVpf4559.png)
In [127] 行:创建Popen 对象,Popen 以子进程执行 'ls -l .' 命令,列出当前目录的文件,命令的执行结果在标准输出stdout, 因为stdout 用PIPE 初始化了,
所以,在In [129] 行,用p.stdout.read() 将内容读出。
2. 以序列的方式传入命令,shell=False:
![](http://s2.51cto.com/wyfs02/M01/88/F9/wKioL1gDqx_DabJPAABth-iAZ-0589.png)
用序列的形式保存命令,就不需要指定shell=True 来运行指令了。指令的运行结果也保存在stdout 里,通过readlines() 方法将结果读出。
3. 用communicate() 方法,与指令进行通信:
![](http://s4.51cto.com/wyfs02/M02/88/FC/wKiom1gDrWSxyNoIAAB_CAmyNKs317.png)
'ls -l' 命令的另一个参数路径名,通过communicat('/tmp') 传入,结果通过元组(outstd, outerr) 接收。
4. 多条命令连通:
在linux 下,经常使用管道将多条命令连在一起,前一条指令的执行结果作为后一条指令的输入,使用Popen 也可以实现。
![](http://s5.51cto.com/wyfs02/M01/88/F9/wKioL1gDr-fCPW7eAABBeaslrTM068.png)
首先,查看test.txt 文件的内容。
然后,子进程pb 的标准输入stdin 用pa.stdout 进行初始化,实现了管道的功能,pa 进程的输出编程了pb进程的输入,最后的输出结果。
把命令当作字符串传给subprocess.Popen()
把命令保存到一个元组,list 的序列,再传给subprocess.Popen()
subprocess模块使用Popen类创建子进程执行命令,首先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=False, startupinfo=None, creationflags=0)
参数说明:
args: 被python执行的命令,一般使用字符串,或者序列(元组或者列表)的形式传入。如果args是一个元组或列表形式,序列的第一个元素就是命令的可执行文件。也可以使用executable 显式地指定可执行文件的路径。
stdin, stdout, stderr :用于和外部进行通信。可以使用 subprcess.PIPE 进行初始化。当stdin, stdout, stderr 被初始化后,就可以和外部进行复杂的通信了。
如:
p = subprocess.Popen() 创建了子进程p 执行命令,外部需要给命令传入参数,则可以用p.communicate(stdin_some)方法,将stdin_some 传入p.stdin 标准输入。
同时p.commucincate() 返回一个tuple 值 (stdout_some, stderr_some) = p.communicate(stdin_some).所以,调用subprocess.Popen() 创建子进程执行命令,可以很方便地和子进程进行通信,获取状态。
注意:如果需要使用communication() 方法与子进程通信,那么在创建子进程时,stdin, stdout, stderr, 都需要用subprocess.PIPE 初始化。
shell : 默认是False, 如果args 的形式是字符串,那么shell=True, 指定命令是用shell 执行的。如果,args 的形式是一个元组或者list,那么shell=False, 指定不需要在shell 中执行命令。
env : 字典, 用于指定子进程的运行环境,默认是None, 说明子进程继承父进程的环境变量。
subprocess.Popen 的一些方法:
Popen.communicate() : 与外部通信,(out, errout) = Popen.communicate(), 返回标准输出和错误输出。
Popen.poll() : 检查子进程的状态,如果是None 则正在运行,如果是0 则退出,如果是-N 则异常退出。
Popen.wait() : 等待进程结束,并获得返回码。
Popen.pid : 返回进程pid 号
Popen.kill() : 杀死进程
举例:
1. 以字符串方式传入,shell=True:
![](http://s1.51cto.com/wyfs02/M01/88/FC/wKiom1gDp4-ChGwVAACOO7GVpf4559.png)
In [127] 行:创建Popen 对象,Popen 以子进程执行 'ls -l .' 命令,列出当前目录的文件,命令的执行结果在标准输出stdout, 因为stdout 用PIPE 初始化了,
所以,在In [129] 行,用p.stdout.read() 将内容读出。
2. 以序列的方式传入命令,shell=False:
![](http://s2.51cto.com/wyfs02/M01/88/F9/wKioL1gDqx_DabJPAABth-iAZ-0589.png)
用序列的形式保存命令,就不需要指定shell=True 来运行指令了。指令的运行结果也保存在stdout 里,通过readlines() 方法将结果读出。
3. 用communicate() 方法,与指令进行通信:
![](http://s4.51cto.com/wyfs02/M02/88/FC/wKiom1gDrWSxyNoIAAB_CAmyNKs317.png)
'ls -l' 命令的另一个参数路径名,通过communicat('/tmp') 传入,结果通过元组(outstd, outerr) 接收。
4. 多条命令连通:
在linux 下,经常使用管道将多条命令连在一起,前一条指令的执行结果作为后一条指令的输入,使用Popen 也可以实现。
![](http://s5.51cto.com/wyfs02/M01/88/F9/wKioL1gDr-fCPW7eAABBeaslrTM068.png)
首先,查看test.txt 文件的内容。
然后,子进程pb 的标准输入stdin 用pa.stdout 进行初始化,实现了管道的功能,pa 进程的输出编程了pb进程的输入,最后的输出结果。
相关文章推荐
- python 调用Linux系统命令笔记
- 使用 Linux 系统调用的内核命令--探究 SCI 并添加自己的调用
- 使用 Linux 系统调用的内核命令【转】
- 使用 Linux 系统调用的内核命令
- Linux下使用python调用top命令获得CPU利用率
- 使用 python 获取 Linux 系统信息(通过dmidecode命令)
- 使用 Linux 系统调用的内核命令
- Python模块之subprocess--使用Popen来调用系统命令
- python 如何调用linux系统中命令
- Linux下使用python调用top命令获得CPU利用率
- (转载) 使用 Linux 系统调用的内核命令, 探究 SCI(systen call interface) 并添加自己的调用.
- python 调用linux系统命令
- 使用 Linux 系统调用的内核命令
- linux下使用系统调用编程实现dir命令功能
- 使用 Linux 系统调用的内核命令
- 使用 Linux 系统调用的内核命令
- Python: 在winXP系统下使用python正常调用zip命令
- 使用Python命令在Linux系统之间传输文件
- 使用 Linux 系统调用的内核命令
- 使用 Linux 系统调用的内核命令