1

当我运行我的 Python 脚本时,有一些功能需要几分钟才能完成,所以我想在 shell 上显示某种计时器,通知用户经过的时间。

有没有这样的东西已经准备好在 Python 中使用?

4

5 回答 5

4

一种简单的方法是在sys.ps1提示中包含一个时钟(通常定义>>>提示的东西)

从文档中sys.ps1

如果将非字符串对象分配给任一变量,str()则每次解释器准备读取新的交互式命令时都会重新评估它;这可用于实现动态提示。

~/.local/usercustomize.py(或更准确地说,在python -c 'import site; print site.USER_BASE'显示的任何文件夹中)中,您可以添加:

import sys
import datetime


class ClockPS1(object):
  def __repr__(self):
    now = datetime.datetime.now()
    return str(now.strftime("%H:%M:%S >>> "))


sys.ps1 = ClockPS1()

然后您的提示将如下所示:

16:26:24 >>> import time
16:26:27 >>> time.sleep(10)
16:26:40 >>> 

这并不完美,因为最后一次出现提示时,而不是执行该行时,但它可能会有所帮助。您可以轻松地显示__repr__调用之间的时间(以秒为单位),并在提示中显示。

于 2012-07-16T15:35:14.387 回答
1

如果您使用的是 Linux 或 BSD 系统,请尝试使用pv命令 ( http://www.ivarch.com/programs/pv.shtml )。

$ python -c 'import time;time.sleep(5)' | pv
   0B 0:00:05 [   0B/s ] [<=>                   ]

它会给你一个计时器,取决于你如何编码你的应用程序的输出,还有一些其他的统计数据。

于 2012-07-16T15:30:39.507 回答
1

最简单的方法是计算函数中经过的时间,该时间需要几分钟才能完成,然后将该时间简单地打印到 shell。但是,根据您的功能,这可能不是最佳解决方案。

第二种方法是使用多线程。因此,让需要一段时间的函数在线程中运行,而您的程序然后处于循环中并每隔一段时间打印出经过的时间并寻找要完成的线程。

就像是:

import threading
import time
arg1=0
arg2=1
etc=2

# your function that takes a while.
# Note: If your function returns something or if you want to pass variables in/out,
# you have to use Queues
def yourFunction(arg1,arg2,etc):
    time.sleep(10) #your code would replace this

# Setup the thread
processthread=threading.Thread(target=yourFunction,args=(arg1,arg1,etc)) #set the target function and any arguments to pass
processthread.daemon=True
processthread.start() # start the thread

#loop to check thread and display elapsed time
while processthread.isAlive():
    print time.clock()
    time.sleep(1) # you probably want to only print every so often (i.e. every second)

print 'Done'

然后,您可以通过覆盖 shell 中的时间来变得更漂亮,甚至更好的是,使用 gui 来显示进度条!

于 2012-07-16T15:06:24.753 回答
0

您可以使用datetime

例如,

import datetime
import time

class Profiler(object):
    def __init__(self):
        self.start = 0
        self.duration = 0

    def start(self):
        self.start = datetime.datetime.now()

    def end(self):
        self.duration = datetime.datetime.now() - self.start

class SomeClass(Profiler):
    def __init__(self):
        Profiler.__init__(self)

    def do_someting(self):
        self.start()
        time.sleep(10)
        self.end()

if __name__ == "__main__":
    foo = SomeClass()
    foo.do_something()
    print 'Time :: ', foo.duration
于 2012-07-16T15:28:30.420 回答
0

您是在谈论测量功能完成然后打印 HH:MM:SS.MS 所需的时间吗?

你可以做:

import datetime, time

time_begin = datetime.datetime.fromtimestamp(time.time())
# call your function here
time_end = datetime.datetime.fromtimestamp(time.time())

print("Time elapsed: ", str(time_end - time_begin))
于 2012-07-16T15:15:18.020 回答