time.gmtime()导致armhf平台上的OverflowError

时间:2015-08-14 07:49:33

标签: python datetime cherrypy

我有一个在Cubox(armhf平台)上运行的网络服务器(CherryPy),在启动wever时我收到以下错误:

[14/Aug/2015:09:33:40] HTTP Traceback (most recent call last):
  File "(...)/lib/python3.4/site-packages/cherrypy/_cprequest.py", line 661, in respond
    self.hooks.run('before_request_body')
  File "(...)/lib/python3.4/site-packages/cherrypy/_cprequest.py", line 114, in run
    raise exc
  File "(...)/lib/python3.4/site-packages/cherrypy/_cprequest.py", line 104, in run
    hook()
  File "(...)/lib/python3.4/site-packages/cherrypy/_cprequest.py", line 63, in __call__
    return self.callback(**self.kwargs)
  File "(...)/lib/python3.4/site-packages/cherrypy/lib/sessions.py", line 901, in init
    httponly=httponly)
  File "(...)/lib/python3.4/site-packages/cherrypy/lib/sessions.py", line 951, in set_response_cookie
    cookie[name]['expires'] = httputil.HTTPDate(e)
  File "(...)/lib/python3.4/site-packages/cherrypy/_cpcompat.py", line 278, in HTTPDate
    return formatdate(timeval, usegmt=True)
  File "/usr/lib/python3.4/email/utils.py", line 177, in formatdate
    now = time.gmtime(timeval)
OverflowError: timestamp out of range for platform time_t

我不确定我是否正确理解了这个问题,而且我不确定它是否可以由我修复。据我所知,Traceback它是由CherryPy引起的。此错误会导致500 Internal Server Error并且无法加载页面。

正如评论中所说,我插入了一份印刷品。我没有看到任何特别的东西。这是启动服务器和尝试加载页面的输出:

1439551125.1483066
1439551132.639804
4593151132.6458025
1439551132.723468
1439551132.7210276
1439551132.7268708
1439551132.7359934
1439551132.741787
1439551132.7452564
4593151132.750907
4593151132.762612
4593151132.749376
4593151132.731232
4593151132.754474
4593151132.763546
1439551132.8183882
4593151132.828029
1439551132.8379567
4593151132.856025
1439551132.8734775
1439551132.8554301
1439551132.879614
4593151132.884698
4593151132.890394
1439551132.8971672
4593151132.902081
4593151132.908171
1439551132.931757
4593151132.944052
1439551132.9759347
1439551132.9714596
4593151132.987068
4593151132.985899
1439551132.9926524
1439551133.0088623
4593151133.013047
1439551133.0280995
4593151133.040709
4593151133.029601
1439551133.0500746
4593151133.057341
1439551133.0749385
4593151133.081711
1439551133.1032782
4593151133.115171
1439551133.1194305
1439551133.1354048
4593151133.143136
4593151133.151044
1439551133.1612003
4593151133.16934
1439551133.1827784
4593151133.19687
1439551133.201899
4593151133.209947
1439551133.271833
4593151133.277573
1439551133.3090906
4593151133.312978
1439551133.3408027
4593151133.344741
1439551133.3722978
4593151133.376283
1439551133.4031894
4593151133.407124
1439551133.434834
4593151133.439074

我不确定这些值中的哪一个会导致错误。我猜它是前面4个人的?在Windows机器time.gmtime(4593151133.439074)上返回一个包含2115年的结构。

在Cubox上启动python shell并输入time.gmtime(4593151133.439074)时,我可以重现错误。但我不知道这些价值来自哪里。

修改

我在CherryPy中找到了文件和行,它返回了导致2115年的浮点数。它是文件session.py中的第949 - 951行:

if timeout:
    e = time.time() + (timeout * 60)
    cookie[name]['expires'] = httputil.HTTPDate(e)

为什么我会超时,我不知道。

2 个答案:

答案 0 :(得分:1)

我找到了这个问题。同事将超时设置为非常高的超时值,这在Linux或Windows上使用32/64位体系结构但在armhf上没有引起任何问题。

我可以通过

将超时设置为较低值来解决问题
cherrypy.request.config.update({'tools.sessions.timeout': 60}) 

答案 1 :(得分:1)

要解决armhf平台上C gmtime()的范围限制,您可以使用显式公式从POSIX时间戳as the docs suggest获取UTC时间:

>>> from datetime import datetime, timedelta
>>> datetime(1970, 1, 1) + timedelta(seconds=4593151133.439074)
datetime.datetime(2115, 7, 21, 11, 18, 53, 439074)
>>> datetime.utcfromtimestamp(4593151133.439074) # calls gmtime() internally
datetime.datetime(2115, 7, 21, 11, 18, 53, 439073) # almost same result on non-"right" timezones
相关问题