我的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来查看文件。