我有一个python脚本,作为它的一部分,它运行一个perl脚本。我使用subprocess模块执行并捕获stdout和{};伪代码是:import subprocess as sp
import sys
perl_script='/usr/.../foo.pl'
p = sp.Popen(perl_script,stdout=sp.PIPE,stderr=sp.PIPE)
fname='test.log'
shell_out=True
text = ''
with open(fname, 'w') as log:
while True:
data = p.stdout.read(1)
if data == '' and p.poll() != None:
break
if data != '':
if shell_out is True:
sys.stdout.write(data)
sys.stdout.flush()
log.write(data)
p.stdout.close()
对于循环的每次迭代,数据似乎是一个字符串字符。在
我遇到的问题是,这个perl脚本显示一个它覆盖的进度条;类似于:
^{pr2}$
每5%更新一次。因此,我要写入的日志文件的内容大致如下:[#.........] 5% [##........] 10% [###.......] 15%
等等。在
有没有一种方法或方法可以重写日志文件中的前一行,或者我唯一的选择是捕获所有文本,尝试修改它,然后将其写入日志文件?在
编辑:我认为我举的例子的简单性质可能无法说明整个故事。这个perl脚本有多个进度条(每个任务一个进度条),并输出我想要记录的附加信息。一个更详细的例子是:NOTICE: one or more of things did stuff and you probably want to take note of it
writing the foo file . . .
writing things . . . [####################] 100%
writing stuff . . . [####################] 100%
writing items . . . [####################] 100%
done
creating other files...
done
请记住,上面的输出是一个与这个perl脚本的stdout特性相匹配的示例,而实际输出(我无法发布)大约是100行左右。在
最后,感谢您的格式化帮助:)
编辑2:我已经放弃了在stdout被捕获时写入日志文件的尝试,而是将stdout存储在变量中,并在脚本完成后写入日志文件。剩下的唯一问题是如何正确格式化字符串,以便正确写入日志文件。更新的伪代码是:import subprocess as sp
import sys
tg_post='/usr/.../foo.pl'
p = sp.Popen(tg_post,stdout=sp.PIPE)
text = ''
fname='test.log'
shell_out=True
while True:
data = p.stdout.read(1)
if data == '' and p.poll() != None:
break
if data != '':
if shell_out is True:
sys.stdout.write(data)
sys.stdout.flush()
text += data
p.stdout.close()
text = text.split('\r')
with open(fname, 'w') as log:
log.write(text)
此时,此代码将为每个状态栏的每个百分比生成一行。我想我可以循环遍历文本中的每个索引(post split),并删除一个索引,其中有一个#而不是100%,但我希望有更健壮的索引。如果我print text(post split),我会在屏幕上看到我想要的。我知道可以使用print来写入文件,但我想避免这种情况(我相信不再使用这种方法)。在