2012-07-16 55 views
1

當我運行我的Python腳本時,有一些函數需要幾分鐘才能完成,所以我想在shell上顯示某種計時器,以便通知用戶時間過去。python:在shell上顯示已用時間

有沒有這樣的東西已經可以在Python中使用了?

+2

這將需要多線程 – gerrit 2012-07-16 14:36:29

+0

該函數是否也用Python編寫的,以便您可以在其中添加幾行? – DSM 2012-07-16 14:41:11

+0

nix命令'time'將顯示執行命令所需的時間,但僅在腳本完成後纔會顯示。 – dm03514 2012-07-16 14:54:47

回答

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' 

然後你可以通過覆蓋時間殼,甚至更好,使用GUI顯示進度條發燒友!

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)) 
+0

哦,不,不是。看到我對我原來的帖子的評論。不管怎樣,謝謝你。 – 2012-07-17 10:27:13

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 
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

一個簡單的方法就是在您的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__調用之間以秒爲單位顯示該時間,並在提示中顯示該時間。

+0

我'愛'這個答案 - 這正是我一直在尋找的東西。只有一個問題 - 我現在有辦法縮進輸出,以便更符合其他所有內容? – ArtOfWarfare 2013-10-31 17:43:23

+0

@ArtOfWarfare你的意思是說,如果你運行'print'blah'',你想讓'blah'縮進9個空格(與時間戳對齊)?你可以攔截寫入'sys.stdout'和'sys.stderr'的所有內容,但是很難很好地處理(例如,如何處理長行?) – dbr 2013-11-01 10:11:43

+1

是的,這就是我的意思。我決定改變時間的風格,以便打印成深青色文字 - 它有助於區分提示和輸出。 – ArtOfWarfare 2013-11-02 05:35:10