python的subprocess.Popen()

时间:2019-07-11 20:28:39

标签: python python-3.x

Linux中有一些命令带有“ fancy”输出-通过“ fancy”,我的意思是它是彩色的并且是实时的,即它覆盖本身,最好的例子是输出top命令another example could be docker build(在构建过程中以交互方式刷新时间(在下面的示例中为0.5s,请参见演示):

[+] Building 0.5s (3/3) FINISHED                                                                                                                                
 => [internal] load .dockerignore                                0.0s
 => => transferring context: 2B                                  0.0s
 => [internal] load build definition from Dockerfile             0.0s
 => => transferring dockerfile: 518B                             0.0s
 => ERROR resolve image config for ...                           0.5s
...

我的问题是,在Python中运行一个进程(大概使用subprocess.Popen时,如何获得相同的输出?我主要对Linux感兴趣。


PS 我能获得的最接近的结果是通过分配tty获得的彩色输出:

out_r, out_w = pty.openpty()
p = subprocess.Popen(command, stdout=out_w, stderr=subprocess.STDOUT, shell=True)
os.close(out_w)
while True:
   try:
      output = os.read(out_r, 1000).decode()
      print(output)

但是,毫不奇怪,它会打印下方的所有内容,而无需重写内容。

1 个答案:

答案 0 :(得分:0)

好吧,对Google来说,正确的词是 ncurses / curses (ncurses / curses ),这立即使我想到了this answer

以下几行对我来说就像是魅​​力:

import pexpect
child = pexpect.spawn(<command_line_str>)
child.interact()