Python subprocess模块功能与常见用法实例

本文实例讲述了Python subprocess模块功能与常见用法。

简介

subprocess可在python3.0中使用,用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。subprocess用来替换多个旧模块和函数:

  • os.system
  • os.spawn*
  • os.popen*
  • popen2.*
  • commands.*

运行python时,我们都是创建并运行一个进程,linux中一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在python中,我们通过标准库的subprocess包来fork一个子进程,并且运行一个外部的程序。subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要从中选取一个使用。另外,subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。


subprocess模块

  • subprocess.run()

接受字符串或者列表形式的命令,返回命令执行结果和状态码

>>> import subprocess

# 需要python解释器解析,则传入命令参数的列表
>>> subprocess.run(["df","-h"])    
Filesystem      Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-LogVol00
           289G  70G 204G 26% /
tmpfs         64G   0  64G  0% /dev/shm
/dev/sda1       283M  27M 241M 11% /boot
CompletedProcess(args=['df', '-h'], returncode=0)

# 需要shell自己解析,则传入命令字符串shell=True
>>> subprocess.run("df -h|grep /dev/sda1", shell=True)  
/dev/sda1       283M  27M 241M 11% /boot
CompletedProcess(args='df -h|grep /dev/sda1', returncode=0)
  • subprocess.call()

执行命令,返回命令执行结果和状态码

>>> import subprocess

>>> subprocess.call(["ls", "-l"])
总用量 28
-rw-r--r-- 1 root root   0 616 10:28 1
drwxr-xr-x 2 root root 4096 622 17:48 _1748
-rw-------. 1 root root 1264 428 20:51 anaconda-ks.cfg
drwxr-xr-x 2 root root 4096 525 14:45 monitor
-rw-r--r-- 1 root root 13160 59 13:36 npm-debug.log

>>> res
0
  • subprocess.check_call()

执行命令,返回结果和状态,正常为0;执行错误则抛出异常

>>> import subprocess

>>> subprocess.check_call(["ls","-l"])
总用量 28
-rw-r--r-- 1 root root   0 616 10:28 1
drwxr-xr-x 2 root root 4096 622 17:48 _1748
-rw-------. 1 root root 1264 428 20:51 anaconda-ks.cfg
drwxr-xr-x 2 root root 4096 525 14:45 monitor
-rw-r--r-- 1 root root 13160 59 13:36 npm-debug.log
0

>>> subprocess.check_call(["lm","-l"])
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib64/python2.7/subprocess.py", line 537, in check_call
  retcode = call(*popenargs, **kwargs)
 File "/usr/lib64/python2.7/subprocess.py", line 524, in call
  return Popen(*popenargs, **kwargs).wait()
 File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
  errread, errwrite)
 File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
  raise child_exception
OSError: [Errno 2] No such file or directory
  • subprocess.getstatusoutput()

接受字符串形式的命令,返回一个元组形式的结果:第一个元素是状态码,第二个为执行结果。

>>> import subprocess

# 执行正确
>>> subprocess.getstatusoutput('pwd')
(0, '/root')

# 执行错误
>>> subprocess.getstatusoutput('pd')
(127, '/bin/sh: pd: command not found')
  • subprocess.getoutput()

接受字符串形式的命令,返回执行结果

>>> import subprocess

>>> subprocess.getoutput('pwd')
'/root'
  • subprocess.check_output()

执行命令,返回运行结果,而不是打印

>>> import subprocess

>>> res = subprocess.check_output("pwd")

# 结果以字节形式返回
>>> res
b'/root\n' 

参考文章

https://www.jb51.net/article/142787.htm

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值