Запуск скрученного примера сценария на Python 3.7 (macOS) вызывает исключение - PullRequest
0 голосов
/ 08 ноября 2019

Я стараюсь, чтобы крутил 19.7.0 на macOS Catalina 10.15.1 с Python 3.7.5 .

Я выбираю пример чата, чтобы проверить, работает ли он (см. Исходный файл chat.py в https://twistedmatrix.com/documents/current/core/howto/servers.html).

. Следуя документации, я установил twisted, используя virtualenv.

Я запускаю скрипти затем я проверяю его с помощью telnet:

telnet 127.0.0.1 8123

Это следует за трассировкой стека:

Unhandled Error
Traceback (most recent call last):
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/log.py", line 86, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 122, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 85, in callWithContext
    return func(*args,**kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/selectreactor.py", line 149, in _doReadOrWrite
    why = getattr(selectable, method)()
--- <exception caught here> ---
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/tcp.py", line 1435, in doRead
    protocol.makeConnection(transport)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/protocol.py", line 514, in makeConnection
    self.connectionMade()
  File "/Users/giacomo/pyenvs/twisted-samples/chat.py", line 13, in connectionMade
    self.sendLine("What's your name?")
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/protocols/basic.py", line 636, in sendLine
    return self.transport.write(line + self.delimiter)
builtins.TypeError: can only concatenate str (not "bytes") to str

Unhandled Error
Traceback (most recent call last):
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/log.py", line 103, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/log.py", line 86, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 122, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/python/context.py", line 85, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/selectreactor.py", line 149, in _doReadOrWrite
    why = getattr(selectable, method)()
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/tcp.py", line 243, in doRead
    return self._dataReceived(data)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/internet/tcp.py", line 249, in _dataReceived
    rval = self.protocol.dataReceived(data)
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/protocols/basic.py", line 572, in dataReceived
    why = self.lineReceived(line)
  File "/Users/giacomo/pyenvs/twisted-samples/chat.py", line 21, in lineReceived
    self.handle_GETNAME(line)
  File "/Users/giacomo/pyenvs/twisted-samples/chat.py", line 29, in handle_GETNAME
    self.sendLine("Welcome, %s!" % (name,))
  File "/Users/giacomo/.virtualenvs/twisted-samples/lib/python3.7/site-packages/twisted/protocols/basic.py", line 636, in sendLine
    return self.transport.write(line + self.delimiter)
builtins.TypeError: can only concatenate str (not "bytes") to str

Мой системный Python - 2.7.16, версия 3 установлена ​​с brew.

Если мне нужно опубликовать больше информации о моей системе, пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 13 ноября 2019

Вот ваша проблема:

    return self.transport.write(line + self.delimiter)
builtins.TypeError: can only concatenate str (not "bytes") to str

Вы смешиваете байты и строковые значения. Из сети вы получаете объект bytes, и вам придется конвертировать str в bytes. Также вы не можете отправить str по сети. Все отправленные данные должны быть bytes. Предполагая, что self.delimiter является строкой, вам просто нужно исправить:

return self.transport.write(line + self.delimiter.encode("utf8"))

PS

Нет необходимости возвращаться на self.transport.write(). И вы подняли вопрос, что документы ориентированы на Python 2.7, и некоторые примеры не работают для Python3 +. Это ошибка на мой взгляд. Это хорошая возможность внести свой вклад в Twisted;)

...