Проблема с запуском примера twisted.words с использованием протокола MSN

В настоящее время я пытаюсь использовать библиотеку Twisted, специально скрученную слова, чтобы попытаться взаимодействовать с MSN. Однако, когда я запускаю пример сценария, предоставленный Twisted, я получаю сообщение об ошибке. В частности, ошибка находится здесь http://i42.tinypic.com/wl945w.jpg . Скрипт можно найти здесь http://twistedmatrix.com/projects/words/documentation/examples/msn_example.py.

Платформа — Vista с Python 2.6.

РЕДАКТИРОВАТЬ: Полный вывод:

Email (passport): [email protected]
Password: ******
2009-04-25 10:52:49-0300 [-] Log opened.
2009-04-25 10:52:49-0300 [-] Starting factory <twisted.internet.protocol.ClientFactory instance at 0x9d87e8c>
2009-04-25 10:52:55-0300 [Dispatch,client] Starting factory <twisted.words.protocols.msn.NotificationFactory instance at 0x9e28bcc>
2009-04-25 10:52:55-0300 [Dispatch,client] Stopping factory <twisted.internet.protocol.ClientFactory instance at 0x9d87e8c>
2009-04-25 10:52:55-0300 [Notification,client] Unhandled Error
    Traceback (most recent call last):
      File "/usr/local/lib/python2.5/site-packages/twisted/python/log.py", line 84, in callWithLogger
        return callWithContext({"system": lp}, func, *args, **kw)
      File "/usr/local/lib/python2.5/site-packages/twisted/python/log.py", line 69, in callWithContext
        return context.call({ILogContext: newCtx}, func, *args, **kw)
      File "/usr/local/lib/python2.5/site-packages/twisted/python/context.py", line 59, in callWithContext
        return self.currentContext().callWithContext(ctx, func, *args, **kw)
      File "/usr/local/lib/python2.5/site-packages/twisted/python/context.py", line 37, in callWithContext
        return func(*args,**kw)
    --- <exception caught here> ---
      File "/usr/local/lib/python2.5/site-packages/twisted/internet/selectreactor.py", line 146, in _doReadOrWrite
        why = getattr(selectable, method)()
      File "/usr/local/lib/python2.5/site-packages/twisted/internet/tcp.py", line 460, in doRead
        return self.protocol.dataReceived(data)
      File "/usr/local/lib/python2.5/site-packages/twisted/protocols/basic.py", line 238, in dataReceived
        why = self.lineReceived(line)
      File "/usr/local/lib/python2.5/site-packages/twisted/words/protocols/msn.py", line 651, in lineReceived
        handler(params.split())
      File "/usr/local/lib/python2.5/site-packages/twisted/words/protocols/msn.py", line 827, in handle_USR
        d = _login(f.userHandle, f.password, f.passportServer, authData=params[3])
      File "/usr/local/lib/python2.5/site-packages/twisted/words/protocols/msn.py", line 182, in _login
        reactor.connectSSL(_parsePrimitiveHost(nexusServer)[0], 443, fac, ClientContextFactory())
    exceptions.TypeError: 'NoneType' object is not callable

2009-04-25 10:52:55-0300 [Notification,client] Stopping factory <twisted.words.protocols.msn.NotificationFactory instance at 0x9e28bcc>

person user95922    schedule 25.04.2009    source источник


Ответы (2)


Поскольку MSN использует соединения SSL, для его использования у вас должен быть установлен pyOpenSSL. Кажется, что вы, вероятно, нет. Тем не менее, это не очень хороший способ для Twisted сообщить об этой отсутствующей зависимости. Я рекомендую подать заявку в систему отслеживания проблем Twisted для улучшения этой отчетности.

person Jean-Paul Calderone    schedule 25.04.2009

Что случилось

Это исключение, которое вы получаете, когда вы пытаетесь вызвать объект, который равен None. Проверь это :

>>> a = str
>>> a() # it's ok, a string is a callable class
''
>>> a = None
>>> a() # it fails, None a special Singleton not meant to be called

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    a()
TypeError: 'NoneType' object is not callable

Что ты можешь сделать

Вы не можете угадать это так, поэтому вам нужно будет сделать некоторую отладку.

Судя по всему, последняя строка (refactor.connectSSL...) содержит три вызова объекта, и один из объектов — None.

Первое, что вы можете сделать, если вы не разбираетесь в отладчиках, это взять каждый элемент строки и добавить непосредственно перед ним:

assert object1 is None 
assert object2 is None

Тогда у вас будет источник вашего исключения. После этого проверьте, почему этот объект имеет значение None. Вам, вероятно, придется проверить документ, чтобы увидеть, в каком случае какой-либо метод, который мог его инициализировать, возвращает None.

Пусть сила...

person e-satis    schedule 25.04.2009