subprocess模块
1). 概述
- 系统命令调用模块
- 导入方式
import subprocess
2). run()方法
- 官方推荐的执行方法:同步方法
- 与之还有一个call方法,使用较少
- 执行案例
a = subprocess.run(["df","-h"], stderr = subprocess.PIPE,
stdout = subprocess.PIPE, check=True)
-
签名解释
-
["df","-h"]
命令参数,开启一个进程 -
stderr = subprocess.PIPE
如果报错,通过管道接受程序执行的错误信息 (命令参数就不能写管道符号) -
stdout = subprocess.PIPE
通过管道接受程序执行结果 (命令参数就不能写管道符号) -
check = True
如果程序执行出现错误,返回一个非0值,解释器就报错
-
-
其他方式
a = subprocess.run("df -h | grep disk1",stderr = subprocess.PIPE,
stdout = subprocess.PIPE,check=True,shell = True)
加一个
shell = True
,命令行参数不用列表的形式,直接写shell下执行的格式,就是直接将内容交给shell,不通过解释器进行拼接
3). Popen()方法
- Popen 将run与call进行封装:异步方法
- 使用案例
a = subprocess.Popen(
"sleep 2",
shell = True,
cwd="/temp",
stdout = subprocess.PIPE,
preexec_fn=sayhi)
a.stdout.read()
- 参数解释
-
args
:shell命令,可以是字符串或者序列类型(如:list,元组) -
shell
:同上 -
stdin, stdout, stderr
:分别表示程序的标准输入、输出、错误句柄 -
preexec_fn
:只在Unix平台下有效,用于指定一个可执行对象(callable object,比如函数的名字),它将在子进程运行之前被调用 -
cwd
:用于设置子进程的当前目录 -
env
:用于指定子进程的环境变量。如果env = None
,子进程的环境变量将从父进程中继承。
-
- Popen调用后会返回一个对象,假设为
a
对象,有如下API-
a.poll()
:Check if child process has terminated. Returns returncode -
a.wait()
:Wait for child process to terminate. Returns returncode attribute. -
a.terminate()
:终止所启动的进程 (不会强制终止,只是发一个终止信号) -
a.kill()
:杀死所启动的进程,强制终止 -
a.communicate(b'22')
:与启动的进程交互,发送数据到stdin,并从stdout接收输出,然后等待任务结束 -
a.send_signal(signal.xxx)
:发送系统信号 -
a.pid
:拿到所启动进程的进程号
-
网友评论