当我运行我的Python脚本时,有一些功能需要几分钟才能完成,所以我想在shell上显示某种计时器,通知用户已经过去的时间。
有没有这样的东西已经准备好在Python中使用了?
答案 0 :(得分:3)
一种简单的方法是在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__
次调用之间以秒为单位的时间,并在提示中显示该内容。
答案 1 :(得分: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来显示进度条!
答案 2 :(得分: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 ] [<=> ]
它会为您提供一个计时器,具体取决于您对应用输出的编码方式,以及其他一些统计数据。
答案 3 :(得分: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))
答案 4 :(得分: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