python subprocess 子进程多次读写

本文最后更新于:2022年8月27日 晚上

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() 后命令就已经开始执行了;
  • 需要将 stdinstdout 设为 subprocess.PIPE 才能通过 stdinstdout 继续读写;
  • 写入命令使用 p.stdin.write(),注意写入的是字节流还是文本;
  • 写入的命令需要带 \n 换行符,否则命令不会执行;
  • 通过 write() 写入命令后如果需要命令立即执行,需要手动调用 flush() 刷新缓冲区;
  • 读取输出可以使用 read()readline()readlines()

需要特别注意,使用这种方式读取输出的内容,当管道中没有更多内容的时候,函数会阻塞直到读到新的输出:

p.stdout.read()
p.stdout.readline()
p.stdout.readlines()

python subprocess 子进程多次读写
https://mxy493.xyz/2022032325189/
作者
mxy
发布于
2022年3月23日
许可协议