我使用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%
答案 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()