用于检查脚本活动的代码(python)

时间:2012-12-05 18:15:00

标签: python

简单问题:

我可以在大多数脚本中添加一些代码或函数,让我知道它的“运行”吗?

因此,执行foo.py后,大多数人会看到闪烁的光标。我目前正在运行一个新的大脚本,它似乎正在工作,但我不会知道,直到错误被抛出或完成(可能没有完成)。

我假设您可以在脚本中的每个for循环的末尾添加一个简单的print "foo-bar"

任何其他整洁的视觉读出技巧?

3 个答案:

答案 0 :(得分:2)

我喜欢clint.progress.bar。对于日志记录,您可以查看Lggr

答案 1 :(得分:0)

你可以log对文件进行处理。您可以打印出点,例如print "."

答案 2 :(得分:0)

print "foo-bar"技巧基本上就是人们为快速和脏脚本所做的事情。但是,如果您有许多循环,则不希望为每个循环打印一行。除了它将填充你的终端的回滚缓冲区这一事实,在许多终端上,当它所做的一切都在反复打印相同的线路时,很难看出是否发生了任何事情。如果你的循环足够快,甚至可能意味着你花费的时间比实际工作要多。

所以,这个技巧有一些常见的变化:

  1. 打印字符或短字而不是整行。
  2. 打印不断变化的内容。
  3. 仅在循环中每N次打印一次。
  4. 要打印没有换行符的单词,您只需print 'foo',。要打印既没有换行也没有空格的角色,您必须sys.stdout.write('.')。无论哪种方式,人们都可以看到光标在水平方向上进行缩放,因此很明显反馈的速度有多快。

    如果您有for n in …循环,则可以打印n。或者,如果您正在逐步构建某些内容,则可以打印len(something)outfile.ftell()或其他内容。即使它不客观有意义,它不断变化的事实意味着你可以知道发生了什么。

    不打印所有时间的最简单方法是添加计数器,并执行counter += 1; if counter % 250 == 0: print 'foo'之类的操作。对此的变化包括检查时间,并且仅在自上一个print以来的1秒或更长时间内打印,或者将任务分解为子任务并在每个子任务结束时打印。

    显然你可以混合搭配。

    但是不要过多努力。如果这只是对你自己使用的快速和肮脏的帮助,你可能想要看起来更专业的东西。只要您可以使用合理可用的终端,就可以打印\r而不是\n并重复覆盖该行,这样您就可以绘制好的进度条或其他反馈(ala {{ 1}},curlwget和其他类似的Unix工具)。但是当然你还需要检测你什么时候不在终端上,或者至少把这些内容写到scp而不是stderr,所以如果有人重定向或管道你的脚本,他们就不会一堆垃圾。并且您可能想要尝试检测终端宽度,如果您可以检测它并且它> 80,则可以缩放进度条或显示更多信息。等等。

    这很复杂,所以你可能想找一个为你做这个的库。那里有很多选择,所以请查看PyPI和/或ActiveState配方。