如果仅从需求的层面看的话,os.system()和subprocess.run()的主要区别是,subprocess.run()能够返回更多的信息,包括执行的输出和执行的返回值,并且它对命令执行的控制更加灵活多变。而os.system()仅仅能知道返回成功还是失败。

方法1:os.system()

os.system方法是os模块最基础的方法,其它的方法一般在该方法基础上封装完成。
system函数可以将字符串转化成命令在服务器上运行·;其原理是每一条system函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程;

返回成功:

# 返回成功
import os
#os.system(cmd)的返回值是脚本的退出状态码,只会有0(成功),1,2
ret = os.system('which cat')
print(f'ret is [{ret}]')

返回失败:

# 返回失败
import os

#删掉一个不存在的文件
ret = os.system('rm -r aa')
#删掉不存在的文件会返回失败
print(f'ret is [{ret}]')

方法2:subprocess.run()

subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
subprocess 模块首先推荐使用的是它的 run 方法,更高级的用法可以直接使用 Popen 接口。

运行成功返回0

# 运行行成功返回0
import subprocess

ret = subprocess.run(['cat', '/proc/version'])
print(f'ret is [{ret}]')
print('ret type is ' + str(type(ret)))
print(f'retuncode is [{ret.returncode}]')

执行结果信息在返回类里

# 命令的执行结果在一个类里
import subprocess
# shell参数的真正作用是交给系统的shell脚本来执行命令,比如复杂的linux命令,建议大家都直接默认shell=True就可以了。
ret = subprocess.run('cat /proc/version', shell=True)
print(f'ret is [{ret}]')

拿到命令执行的结果和返回值

# 拿到命令执行的结果和返回值
import subprocess
# shell参数的真正作用是交给系统的shell脚本来执行命令,比如复杂的linux命令,建议大家都直接默认shell=True就可以了。
ret = subprocess.run('cat /proc/version', shell=True, capture_output=True)
print(f'ret is [{ret}]')
print('stdout is ' + ret.stdout.decode('utf8'))

设置执行等待时间,避免自动化用例freeze

# 拿到命令执行的结果和返回值+设置超时时间(限定执行时间,如果超时,则报错,写法如下)
import subprocess
# shell参数的真正作用是交给系统的shell脚本来执行命令,比如复杂的linux命令,建议大家都直接默认shell=True就可以了。
ret = subprocess.run('ping www.baidu.com -c 5', shell=True, capture_output=True, timeout=1)
print(f'ret is [{ret}]')
print('stdout is ' + ret.stdout.decode('utf8'))
Logo

更多推荐