python 执行 linux 命令 —— subprocess

python 脚本内执行 linux 命令有多种方式,os.system(), os.popen()也可以,官方最新推荐方式为subprocess

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import subprocess

# 执行cmd并等待运行结束,返回执行状态码
subprocess.call('ls', shell=True) # 与 os.system() 功能相似

# 执行cmd并等待运行结束,返回执行状态码
subprocess.check_call('ls', shell=True) # 与subprocess.call()不同,returncode不为0,触发CalledProcessError异常

# 执行cmd并等待运行结束,返回 /dev/stdout 信息
subprocess.check_output('ls', shell=True,
universal_newlines=True) # 以 string 形式返回 stdout 信息,而不是bytes,与 os.popen() 功能相似

# 不等待 cmd 运行结束
job = subprocess.Popen('ls -l', # string of cmd
shell=True, # 传入参数作为 shell 进行执行
stdout=subprocess.PIPE, # 输出标准输出到subprocess流程
stderr=subprocess.PIPE, # 输出标准错误到subprocess流程
universal_newlines=True) # stdout 返回时,使用 string 代替 bytes 类型
pid = job.pid # 获得 cmd 本地执行的 pid
job.wait() # 等待工作结束,默认Popen不等待 cmd 执行完毕即退出
stdout, stderr = job.communicate() # 获得 cmd 执行返回标准输出、标准错误
# 设置 stdin=subprocess.PIPE 时,可以在communicate(input='...')传入参数
job.returncode # 获得 cmd 执行状态码
job.kill() # 杀死 cmd 进程

os 模块实现 linux cmd 执行

1
2
3
4
5
import os

os.system('ls -l') # 直接返回 cmd 执行状态码
# assert not os.system('ls')
os.popen('ls -l') # 以文件句柄的方式返回 cmd 执行的stdout信息
---------本文结束,感谢您的阅读---------