python执行系统命令常用方法(subprocess、os、commands)

一、subprocess模块 (-- Python3.x)
使用 subprocess.check_output() 函数。例如:

import subprocess
out_bytes = subprocess.check_output(['netstat','-a'])

这段代码执行一个指定的命令并将执行结果以一个字节字符串的形式返回。
如果你需要文本形式返回,加一个解码步骤即可。例如:

out_text = out_bytes.decode('utf-8')

如果被执行的命令以非零码返回,就会抛出异常。 下面的例子捕获到错误并获取返回码:

try:
    out_bytes = subprocess.check_output(['cmd','arg1','arg2'])
except subprocess.CalledProcessError as e:
    out_bytes = e.output       # Output generated before error
    code      = e.returncode   # Return code

默认情况下,check_output() 仅仅返回输入到标准输出的值。 如果你需要同时收集标准输出和错误输出,使用 stderr 参数:

out_bytes = subprocess.check_output(['cmd','arg1','arg2'],stderr=subprocess.STDOUT)

如果你需要用一个超时机制来执行命令,使用 timeout 参数:

try:
    out_bytes = subprocess.check_output(['cmd','arg1','arg2'], timeout=5)
except subprocess.TimeoutExpired as e:
    ...

通常来讲,命令的执行不需要使用到底层shell环境(比如sh、bash)。 一个字符串列表会被传递给一个低级系统命令,比如 os.execve() 。

如果你想让命令被一个shell执行,传递一个字符串参数,并设置参数 shell=True . 有时候你想要Python去执行一个复杂的shell命令的时候这个就很有用了,比如管道流、I/O重定向和其他特性。例如:
out_bytes = subprocess.check_output('grep python | wc > out', shell=True)
注意

使用 check_output() 函数是执行外部命令并获取其返回值的最简单方式。 但是,如果你需要对子进程做更复杂的交互,比如给它发送输入,你得采用另外一种方法。 这时候可直接使用 subprocess.Popen 类。例如:

import subprocess

# Some text to send
text = b'''
hello world
this is a test
goodbye
'''

# Launch a command with pipes
p = subprocess.Popen(['wc'],
          stdout = subprocess.PIPE,
          stdin = subprocess.PIPE)

# Send the data and get the output
stdout, stderr = p.communicate(text)

# To interpret as text, decode
out = stdout.decode('utf-8')
err = stderr.decode('utf-8')

二、os模块
1、os.system(cmd)
运行系统命令,不能获取标准输出

>>> import os
>>> status = os.system('date')
Sun Dec 30 23:14:35 CST 2018
>>> status
0

2、os.popen(cmd)
获取标准输出:

>>> output = os.popen('date')
>>> output
<os._wrap_close object at 0x103a3b588>
>>> output.read()
'Sun Dec 30 23:17:54 CST 2018\n'
# 去掉换行符
>>> output = os.popen('date').read().strip('\n')
>>> output
'Sun Dec 30 23:21:44 CST 2018'

三、commands模块(–python2.x, python3.x中废弃

getoutput	获取执行命令后的返回信息
getstatus	获取执行命令的状态值(执行命令成功返回数值0,否则返回非0)
getstatusoutput	获取执行命令的状态值以及返回信息
# example
>>> import commonds
>>> status, output = commands.getstatusoutput('date')
>>> status
0
>>> output
'Sun Dec 30 23:10:12 CST 2018'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值