Python スクリプトを実行すると、完了までに数分かかる関数があるため、ユーザーに経過時間を知らせるある種のタイマーをシェルに表示したいと考えています。
Python で既に使用できるものはありますか?
単純な方法の 1 つは、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__
呼び出し間の時間を秒単位で表示し、それをプロンプトに表示するのは簡単です。
Linux または BSD システムを使用している場合は、pv
コマンド ( http://www.ivarch.com/programs/pv.shtml ) を試してください。
$ python -c 'import time;time.sleep(5)' | pv
0B 0:00:05 [ 0B/s ] [<=> ]
タイマーが表示され、アプリの出力のコーディング方法に応じて、他の統計情報も表示されます。
これを行う最も簡単な方法は、完了するまでに数分かかる関数の経過時間を計算し、その時間をシェルに単純に出力することです。ただし、機能によっては、これはおそらく最善の解決策ではありません。
2 番目の方法は、マルチスレッドを使用することです。したがって、しばらく時間がかかる関数をスレッドで実行し、プログラムはループに入って経過時間を時々出力し、スレッドが完了するのを探します。
何かのようなもの:
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 を使用して進行状況バーを表示することで、より洗練されたものにすることができます!
関数が完了してから 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))
あなたが使用することができます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