Python使用Subprocess.Popen启动进程

简介:

subprocess.Popen()用于创建一个子进程,并连接到子进程的标准输入/输出/错误管道,来管理进程

Popen原型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#原型中带参数的值都是默认值
class subprocess.Popen(
args,
bufsize=0,
executable=None,
stdin=None,
stdout=None,
stderr=None,
preexec_fn=None,
close_fds=False,
shell=False,
cwd=None,
env=None,
universal_newlines=False,
startupinfo=None,
creationflags=0)
参数 含义
args 要执行的shell命令,可以是字符串或者列表
bufsize 0 无缓冲
1 行缓冲
其他正值 缓冲区大小
负值 采用默认系统缓冲(一般是全缓冲)
executable 一般不用,args字符串或列表第一项表示程序名
stdin
stdout
stderr
None 没有任何重定向,继承父进程
PIPE 创建管道
文件对象
文件描述符(整数)
stderr 还可以设置为 STDOUT
preexec_fn 钩子函数, 在fork和exec之间执行。(unix平台下有效)
close_fds unix 下执行新进程前是否关闭0/1/2之外的文件
windows下不继承还是继承父进程的文件描述符
shell 如果为True
unix下相当于args前面添加了 “/bin/sh“ ”-c”
window下,相当于添加”cmd.exe /c”
cwd 设置工作目录
env 设置环境变量
universal_newlines 各种换行符统一处理成 ‘\n’
startupinfo 传递给CreateProcess的结构体(windows平台下有效)
creationflags 传递CREATE_NEW_CONSOLE创建自己的控制台窗口(windows平台下有效)

Popen对象方法:

方法 说明
poll() 检查进程是否终止,如果终止返回 returncode,否则返回 None
wait(timeout) 等待子进程终止,超时抛异常
communicate(input,timeout) 和子进程交互,发送和读取数据
send_signal(singnal) 发送信号到子进程
terminate() 停止子进程,也就是发送SIGTERM信号到子进程
kill() 杀死子进程。发送 SIGKILL 信号到子进程

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
write_buffer = req_fight()
#获取文件对象
fd_stderr = open("stderr.txt", "w+")
#启动子进程
subp = subprocess.Popen(
"battleerl_d.exe ./CFG/",#命令参数等同于["battleerl_d.exe","./CFG/"]
shell=True,#windows下用cmd命令启动
stdout= subprocess.PIPE,#创建PIPE管道输出
stdin=subprocess.PIPE,#创建PIPE管道输入
stderr=fd_stderr#文件对象
)
#管道输入bytes
subp.stdin.write(write_buffer)
#刷新输入缓存区
subp.stdin.flush()
#管道读取bytes长度为2
read_buffer = subp.stdout.read(2)
#管道读取bytes一行
read_buffer = subp.stdout.readline()

注意:

使用PIPE管道
subp.stdout.read()和subp.stdout.readlines()
如果不加参数限制读取bytes大小可能会堵塞(无法拿到数据,与管道缓存无关)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!