Торнадо + кевент на Mac OSX

Недавно я столкнулся с проблемами запуска торнадо на Mac OSX Yosemite. Делая запрос к серверу торнадо, я получаю следующую трассировку:

ERROR:tornado.general:Uncaught exception
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/tornado/http1connection.py", line 674, in _server_request_loop
    ret = yield conn.read_response(request_delegate)
  File "/Library/Python/2.7/site-packages/tornado/gen.py", line 628, in run
    value = future.result()
  File "/Library/Python/2.7/site-packages/tornado/concurrent.py", line 109, in result
    raise_exc_info(self._exc_info)
  File "/Library/Python/2.7/site-packages/tornado/gen.py", line 175, in wrapper
    yielded = next(result)
  File "/Library/Python/2.7/site-packages/tornado/http1connection.py", line 157, in _read_message
    max_bytes=self.params.max_header_size)
  File "/Library/Python/2.7/site-packages/tornado/iostream.py", line 227, in read_until_regex
    self._try_inline_read()
  File "/Library/Python/2.7/site-packages/tornado/iostream.py", line 673, in _try_inline_read
    self._add_io_state(ioloop.IOLoop.READ)
  File "/Library/Python/2.7/site-packages/tornado/iostream.py", line 881, in _add_io_state
    self.fileno(), self._handle_events, self._state)
  File "/Library/Python/2.7/site-packages/tornado/ioloop.py", line 677, in add_handler
    self._impl.register(fd, events | self.ERROR)
  File "/Library/Python/2.7/site-packages/tornado/platform/kqueue.py", line 41, in register
    self._control(fd, events, select.KQ_EV_ADD)
  File "/Library/Python/2.7/site-packages/tornado/platform/kqueue.py", line 59, in _control
    kevents.append(select.kevent(
AttributeError: 'module' object has no attribute 'kevent'

Последняя строка самая важная. Я вполне уверен, что это просто из-за отсутствия пакета варева, но я не знаю, чего мне не хватать.

Еще более загадочно, я могу импортировать select и посмотреть, что функция kevent существует.

Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import select
>>> select.kevent
<type 'select.kevent'>

1 ответ

Поэтому я нашел временное решение, которое я чувствую себя немного виноватым даже из-за того, что вызываю ответ, но вот оно:

1) Откройте файл /usr/local/lib/python2.7/site-packages/tornado/platform/kqueue.py (или аналогичный). 2) Сразу после import selectдобавьте следующую строку:

cached_kevent = select.kevent

3) Заменить следующие строки:

kevents.append(select.kevent(
    fd, filter=select.KQ_FILTER_READ, flags=flags))

с этой модифицированной версией:

try:
    kevents.append(select.kevent(
        fd, filter=select.KQ_FILTER_READ, flags=flags))
except AttributeError:
    kevents.append(cached_kevent(
       fd, filter=select.KQ_FILTER_READ, flags=flags))

Любые лучшие ответы будут высоко оценены.

Другие вопросы по тегам