cherrypy /dev/urandom (или аналогичный) не найден — ошибка

Я использую сервер cherrypy 3.2.0 с Python 2.5. 1, которая выдает следующую ошибку каждые несколько дней при выполнении любой инструкции из пользовательского интерфейса, пока она не будет уничтожена и перезапущена:

[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имеет следующий фрагмент кода, который предполагает наличие резервного варианта random.randomна случай, если cherrypy не сможет прочитать /dev/urandom, но, похоже, не откажется от него.

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, актуально в контексте: -

if not _exists("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()"

У меня два вопроса: -

  1. Почему Cherpy выдает не реализованную ошибку, когда я могу читать случайные биты из /dev/urandom
  2. Почему _cpcompact.pyне выполняет за исключением часть, когда os.pyвызывает NotImplementedError.
5
задан tMC 29 March 2012 в 19:42
поделиться