python subprocess 子进程多次读写
本文最后更新于:2023年2月8日 晚上
subprocess 子进程多次写入命令示例:
p = subprocess.Popen('bluetoothctl', shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
p.stdin.write('power on\n'.encode('utf-8')) # 需要加换行符表示输入结束
p.stdin.flush() # 刷新缓冲区才会立即执行写入的命令
p.stdin.write('scan on\n'.encode('utf-8'))
p.stdin.flush() # 如果没有手动刷新,则会在调用communicate()时刷新将多条命令一起写入并执行
sleep(5) # 如果没有手动刷新缓冲区,该延时前后通过stdin写入的命令都还没有执行
p.stdin.write('scan off\n'.encode('utf-8'))
p.stdin.flush()
p.stdin.write('exit'.encode('utf-8'))
p.stdin.flush()
stdout_data, stderr_data = p.communicate()
简单总结下:
- 调用
subprocess.Popen()
后命令就已经开始执行了; - 需要将
stdin
和stdout
设为subprocess.PIPE
才能通过stdin
和stdout
继续读写; - 写入命令使用
p.stdin.write()
,注意写入的是字节流还是文本; - 写入的命令需要带
\n
换行符,否则命令不会执行; - 通过
write()
写入命令后如果需要命令立即执行,需要手动调用flush()
刷新缓冲区; - 读取输出可以使用
read()
、readline()
或readlines()
。
需要特别注意,使用这种方式读取输出的内容,当管道中没有更多内容的时候,函数会阻塞直到读到新的输出:
p.stdout.read()
p.stdout.readline()
p.stdout.readlines()
python subprocess 子进程多次读写
https://mxy493.xyz/2022032325189/