Python 和 Bash - 如何在文件中"print"输出并在执行时"tail"它



我的python脚本中有许多print语句。它做的一些工作需要一天以上的时间,所以我需要在执行output文件时定期跟踪日志。如果我执行

python migrate.py > output.txt

我的文件只有在脚本完成后才被填充(24小时后(,这不适合我。我也尝试过:

python migrate.py  2>&1 | tee output.txt

但在这种情况下:

  • 执行此操作时,终端中不会打印任何内容
  • tail命令在脚本完成之前不提供输出

我希望能够使用tail查看输出文件的内容,但在脚本完成之前,文件的大小始终为0。非常感谢!

编辑:我的代码示例(如果这是相关的,但我不这么认为(

............
.............
.............
def main():
"""
Script main function
"""
start_time = datetime.datetime.now()
print ("----------------------------------------------------------------------------")
print ("### script started ###")
args = get_args()
print ("depot:"+depot)
print ("stream:"+args[0])
print ("destination:"+args[1])
print ("----------------------------------------------------------------------------")

logfile = get_history(args[0])
print ("----------------------------------------------------------------------------")

git_migrate(logfile, args[0], args[1], args[2], args[3], depot)
print ("----------------------------------------------------------------------------")        

print ("### script completed ###")    
end_time = datetime.datetime.now()
print('Duration: {}'.format(end_time - start_time))

if __name__ == '__main__':
main()

发送到stdout的输出(无论是由print()还是由类似sys.stdout.write()的东西发送(正在缓冲区中累积。您可以通过使用sys.stdout.flush():刷新缓冲区来使其定期写入

import time
import sys
for x in range(1000):
time.sleep(5)
# Either sys.stdout.write or print works here
print(x)  # sys.stdout.write(str(x))
if x % 5 == 0:
sys.stdout.flush()

这将写入每五次循环迭代重定向一次输出的文件。

在您的代码中,您只需要将sys.stdout.flush()放在您希望能够看到进度的任何位置。(这可能在循环中,也可能不在循环中;在我的例子中,这只是生成运行一段时间的代码。(

正如@matszwecja所说,file.write是您的最佳选择。自己试试:

count = 0
file = open("file.txt", "a")
while(True):
file.write(str(count) + "n")
count += 1
if count == 34:
count = 0

有了这段简单的代码,您可以看到,当循环运行时,您可以在另一个选项卡中执行tail,它会为您提供输出,所以只需更改file.writes的打印(或同时输出两者(,它就会完成任务。

在您的代码中:

def main():
"""
Script main function
"""
file = open("log.log", "a")
start_time = datetime.datetime.now()
file.write ("----------------------------------------------------------------------------")
file.write ("### script started ###")
args = get_args()
file.write ("depot:"+depot)
file.write ("stream:"+args[0])
file.write ("destination:"+args[1])
file.write ("----------------------------------------------------------------------------")

logfile = get_history(args[0])
file.write ("----------------------------------------------------------------------------")

git_migrate(logfile, args[0], args[1], args[2], args[3], depot)
file.write ("----------------------------------------------------------------------------")        

file.write ("### script completed ###")    
end_time = datetime.datetime.now()
file.write('Duration: {}'.format(end_time - start_time))

这样,您就可以在编写文件时使用tail来查看文件。

最新更新