打印stdout子进程Popen并保留格式

时间:2017-04-27 17:06:13

标签: python python-2.7 subprocess

我使用subprocess.Popen来调用安装脚本。但是,当我通过print将输出传输到终端时,它会从安装脚本输出中丢失任何格式。例如,所有终端颜色都消失了,下载进度条出现在多行上。

这是我的代码:

process = subprocess.Popen(
    [script],
    shell=True,
    cwd=script_dir,
    universal_newlines=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
    env={
        'WORKSPACE': build_dir
    })
with process.stdout:
    for line in iter(process.stdout.readline, b''):
        print(line)

输出样本(通常显示为进度条):

You need to run "nvm install 4.2.2" to install it before using it.
Downloading and installing node v4.2.2...
Downloading https://nodejs.org/dist/v4.2.2/node-v4.2.2-darwin-x64.tar.gz...

                                                                          0.0%
                                                                          1.0%
###                                                                        4.6%
#######                                                                   10.5%
#############                                                             18.8%
###################                                                       26.5%
########################                                                  34.1%
##############################                                            41.9%
###################################                                       49.7%
#########################################                                 57.4%
##############################################                            65.2%
####################################################                      73.0%
##########################################################                80.8%
###############################################################           88.5%
#####################################################################     96.3%
######################################################################## 100.0%

2 个答案:

答案 0 :(得分:0)

print statement在最后打印了额外的换行符。请改用sys.stdout.write

import sys

...    

with process.stdout:
    for line in iter(process.stdout.readline, b''):
        sys.stdout.write(line)  # <--
        sys.stdout.flush()      # <--

顺便说一句,你可以使用subprocess.call而不捕获stdout,stderr输出,除非你想在你的程序中处理输出:

subprocess.call(
    [script],
    shell=True,
    cwd=script_dir,
    env={
        'WORKSPACE': build_dir
    })

答案 1 :(得分:0)

无需调用“ iter”。实际上,当我尝试this suggestion时它抱怨,因为它期望一个字符串,而不是字节。

这可以重定向完全相同的输出:

process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, universal_newlines=True)
for line in process.stdout:
    sys.stdout.write(line)
    sys.stdout.flush()