【Python】基础部分 -- 常用模块 -- subprocess 通过系统命令执行子程序
subprocess 通过系统命令执行子程序
1) 说明
执行系统命令同时获得命令结果
执行命令的方法
popenargs = ['ping','127.1.0.0']
kwargs = {}
subprocess.run(popenargs, input=None, timeout=None, check=False, **kwargs) # 官方推荐
subprocess.call(popenargs, timeout=None, **kwargs) # 与上一条差不多
# subprocess.Popen() # 上面各种方法的底层封装
2) run方法
*标准写法
a=subprocess.run(['df','-h'],stderr=subprocess.PIPE,stdout=subprocess.PIPE,check=True)
a.stdout()
stdout、stderr为管道给程序传递数据
*带管道符的命令
subprocess.run('df -h|grep disk1',shell=True) #命令直接交给shell处理
3) call方法 (略)
4) Popen方法
*参数
args : shell 命令, 可以是字符串或者序列类型 (如:list, 元组)
stdin,stdout,stderr: 分别表示程序的标准输入、输出、错误句柄
preexec_fn: 只在unix平台下有效,用于指定一个可执行对象(callable object),它将在 之前被调用
shell: 同上
cwd: 用于设置子进程的当前目录
env: 用于指定子进程的环境变量.如果env = None,子进程的环境变量将从父进程中继承
*区别
a = subprocess.run(...)
a = subprocess.Popen(...)
run会导致进程阻塞,popen会生成独立进程执行系统命令
*Popen的其他方法
print(
'\nterminate',subprocess.Popen.terminate(a), # 给子进程发送终止信号,非强制性 SIGTERM
'\npoll',subprocess.Popen.poll(a) , # 检查子进程是否终止,有延迟
'\nwait',subprocess.Popen.wait(a) ,# 等待子进程终止,
'\nkill',subprocess.Popen.kill(a) , # 强制终止 SIGKILL
# subprocess.Popen.communicate(b'hahaha') , # 与启动的进程进行交互,发送数据到stdin,并从stdout接收输出,只能交互一次
# subprocess.Popen.send_signal(signal.SIGKILL) , # 发送系统信号,如signal.SIGKILL
)
系统输入pid 获取子进程的进程号