Python 在Django管理命令期间显示单行进度,并在测试期间禁用它

Python 在Django管理命令期间显示单行进度,并在测试期间禁用它,python,django,testing,Python,Django,Testing,我有一些Django管理命令,它们调用其他类中的方法来执行各种任务,比如从外部API获取数据 在这些方法中,我输出一行显示进度,类似于: print('Fetched %d of %d' % (n, total) + ' '*30, end='\r') 这很好,但是当我运行我的测试时,它会被打印出来,并将…E……F…显示搞砸。我可以在所有测试中修补打印,但这似乎很笨拙 因此,(a)我是否应该以其他方式输出进度线,和/或(b)是否有更好的方法在运行测试时抑制该输出?第一步实际上是摆脱打印语句,并

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

在这些方法中,我输出一行显示进度,类似于:

print('Fetched %d of %d' % (n, total) + ' '*30, end='\r')
这很好,但是当我运行我的测试时,它会被打印出来,并将
…E……F…
显示搞砸。我可以在所有测试中修补
打印
,但这似乎很笨拙


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

第一步实际上是摆脱打印语句,并将其替换为

使用django日志记录,您可以获得比打印多得多的控制,而且设置起来并不困难。其中两个关键特性是,您可以控制日志消息是转到文件还是转到控制台。您还可以根据调试标志对其进行进一步微调


您可能需要这些消息只出现在您的dev服务器上,而不出现在生产环境中。因此,日志记录可以帮助您做到这一点。更重要的是,当测试运行时,它会关闭调试标志,这样您的….E….F就不会混乱。

谢谢。我不确定是否要为此使用日志记录,尽管很高兴得到纠正!首先,这些print语句只用于从命令行运行并带有管理命令的代码,因此,如果它们发生在live server上就可以了。第二,它们被用来打印一行,其数字会随着进度而更新-日志记录可以做到吗?是的。可以将日志看作是更完善和增强的打印版本。我已经做了一些日志工作,但我看不到如何覆盖控制台中的前一行,就像我可以使用
print('hello',end='\r')
一样。我也不知道这一行。但这有关系吗?是的-如果我显示一个需要一小时的任务进度,从API获取3000项,那么我希望有一行更新,而不是填充控制台的3000行(或者如果我每10行更新一次,则为300行),等等。您可以在打印时使用自己的包装器,这将检查sys.stdout是否为终端,并根据其行为不同,例如。\r对于终端\n对于文件或管道