我正在运行一个基于Cherrypy 3.2.0和Python 2.5.1的服务器,但是每隔几天UI会给出如下错误提示,并且需要重启才能继续使用:
[29/Mar/2012:06:37:57] HTTP Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 636, in respond
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 97, in run
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 57, in __call__
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 757, in init
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 162, in __init__
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 190, in _regenerate
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 204, in generate_id
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cpcompat.py", line 264, in random20
File "/usr/lib/python2.5/os.py", line 733, in urandom
NotImplementedError: /dev/urandom (or equivalent) not found
`_cpcompat.py`中的以下代码段表明,如果cherrypy无法读取`/dev/urandom`,则会回退到`random.random`,但似乎没有回退。
```html
_cpcompat.py
有以下代码,表明如果cherrypy无法读取/dev/urandom
,则会回退到random.random
,但似乎没有回退。
try:
os.urandom(20)
import binascii
def random20():
return binascii.hexlify(os.urandom(20)).decode('ascii')
except (AttributeError, NotImplementedError):
import random
# os.urandom not available until Python 2.4. Fall back to random.random.
def random20():
return sha('%s' % random.random()).hexdigest()
以下是与上下文相关的来自
os.py
的代码片段:
如果没有“urandom”:
def urandom(n):
"""urandom(n) -> str
Return a string of n random bytes suitable for cryptographic use.
"""
try:
_urandomfd = open("/dev/urandom", O_RDONLY)
except (OSError, IOError):
raise NotImplementedError("/dev/urandom (or equivalent) not found")
bytes = ""
while len(bytes) < n:
bytes += read(_urandomfd, n - len(bytes))
close(_urandomfd)
return bytes
当cherrypy无法读取/dev/urandom
时,以下代码片段可以正常工作:
python -c "import os;fd = open('/dev/urandom', 'r');print fd.read(5);fd.close()"
我有两个问题:
- 为什么cherrypy会抛出未实现的错误,而我能够从/dev/urandom读取随机位?
- 为什么
_cpcompact.py
在os.py
引发NotImplementedError
时没有执行except部分?
python -c "import os; print os.urandom(5)"
运行正常吗? - tMCos.py
中加入一些调试代码来将异常信息写入系统日志(或其他文件),那将会非常有帮助。 - tMC