2016-12-20 5 views
0

Вызов datetime.now() в настоящее время возвращается в то же время, что и в первый раз, даже при вызове через несколько часов.python datetime.now() не возвращает обновленную временную метку из заголовка функции включенного файла

У меня есть следующий код. В first.py

#!/usr/bin/env python 
import sys 
import time 
import datetime as dt 
import fns_print as pr 
import fns_time as tm 

def main(argv): 
    pr.ts_print("STARTED") 
    # do a bunch of other stuff that takes 10+ seconds 
    pr.ts_print("Finished Download Pass") 

if __name__ == "__main__": 
    main(sys.argv) 

fns_print.py:

#!/usr/bin/env python 
from __future__ import print_function 
import fns_time as tme 

def ts_print(string, **kwargs): 
    """Print timestamped message to stdout and into log file""" 
    print("{}: {}".format(tme.strTimeSt(),string),**kwargs) 
    return True 

fns_time.py

#!/usr/bin/env python 
import time 
from datetime import datetime, tzinfo, timedelta ## pip install datetime 
from dateutil import tz 
PST = tz.tzoffset("PST",-28800) # datetime.tzinfo.FixedOffset(-(8*60),"PST") 
UTC = tz.tzutc() # UTC = tz.tzoffset("UTC",0) 

def getCurTime(localTime = False): 
    """get current time, by default in UTC. if localTime is True, it uses local system time""" 
    return datetime.now(tz=UTC) if not localTime else datetime.now(tz=tz.tzlocal()) 

def strTimeSt(t = datetime.now(tz=UTC), PSTConvert=False): 
    """return a string representation of a datetime object. Uses UTC by default 
    Can also convert to PST with PSTConvert=True. Never converts to PDT.""" 
    tf = t if not PSTConvert else t.astimezone(tz=PST) 
    return tf.strftime("%Y-%m-%d %H:%M:%S %Z (%z)") 

выход двух вызовов (один пробега):

2016- 12-20 18:45:04 UTC (+0000): НАЧАЛО
2016-1 2-20 18:45:04 UTC (+0000): Закончено Скачать Pass

предыдущий прогон дал как раз 18:41:28

ответ

7

datetime.now(tz=UTC) значение Аргумент по умолчанию вычисляется один раз, когда функция определена. Если вы хотите, чтобы оценить заново каждый раз, когда вызывается функция, вам нужно, чтобы переместить его внутри функции:

def strTimeSt(PSTConvert=False): 
    """return a string representation of a datetime object. Uses UTC by default 
    Can also convert to PST with PSTConvert=True. Never converts to PDT.""" 
    t = datetime.now(tz=UTC) 
    tf = t if not PSTConvert else t.astimezone(tz=PST) 

    return tf.strftime("%Y-%m-%d %H:%M:%S %Z (%z)") 

Если вы все еще хотите разрешить прохождение DateTime, вы могли бы сделать значение по умолчанию будет None , а затем проверьте значение «Нет» и вызовите только .now(), если ничего не было передано:

def strTimeSt(t=None, PSTConvert=False): 
    """return a string representation of a datetime object. Uses UTC by default 
    Can also convert to PST with PSTConvert=True. Never converts to PDT.""" 
    if t is None: 
     t = datetime.now(tz=UTC) 
    tf = t if not PSTConvert else t.astimezone(tz=PST) 
    return tf.strftime("%Y-%m-%d %H:%M:%S %Z (%z)")