【问题标题】:Displaying single line progress during Django management command and disabling it during tests在 Django 管理命令期间显示单行进度并在测试期间禁用它
【发布时间】:2016-09-01 22:08:31
【问题描述】:

我有一些 Django 管理命令,它们调用其他类中的方法来执行各种任务,例如从外部 API 获取数据。

在这些方法中,我输出了一行显示进度,例如:

print('Fetched %d of %d' % (n, total) + ' '*30, end='\r')

这很好,但是当我运行我的测试时,它会被打印出来并搞砸.....E....F... 显示。我可以在所有测试中修补 print,但这似乎很笨拙。

所以 (a) 我应该以其他方式输出该进度线,和/或 (b) 是否有更好的方法在运行测试时抑制该输出?

【问题讨论】:

  • 你可以有你自己的 print 包装器,它会检查 sys.stdout 是否是一个终端,并且取决于它的行为不同,例如\r 代表终端 \n 代表文件或管道

标签: python django testing


【解决方案1】:

第一步其实就是去掉打印语句,换成logging

使用 django 日志,您可以获得比使用打印更多的控制权,而且设置起来也不难。其中两个关键功能是您可以控制日志消息是转到文件还是控制台。您还可以根据 DEBUG 标志进一步微调它。

您可能需要此消息仅出现在您的开发服务器上,而不是在生产中。所以日志记录可以帮助你。更重要的是,在运行测试时,它会关闭调试标志,这样您的 .....E....F 就不会杂乱无章。

【讨论】:

  • 谢谢。我不确定是否要为此使用日志记录,尽管很高兴得到纠正!首先,这些打印语句仅用于从命令行使用管理命令运行的代码,因此如果它们发生在实时服务器上就可以了。其次,它们用于打印单行,其数字会随着进度而更新 - 日志记录可以做到这一点吗?
  • 是的。将日志记录视为更精致和增强的打印版本。
  • 我有一些日志记录工作,但我看不到如何覆盖控制台中的前一行,就像我可以使用 print('hello', end='\r') 一样。
  • 我也不知道那个。但这有关系吗?
  • 是的 - 如果我要显示一个需要一个小时的任务的进度,从 API 获取 3000 个项目,那么我希望有一个更新的行,而不是填满 3000控制台的行数(如果我每 10 次更新一次,则为 300 行等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2012-06-06
  • 2020-11-10
  • 2014-02-24
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
相关资源
最近更新 更多