4

我正在尝试使用 Tornado 服务器在 RasPi 上运行一个小型 python webapp,但是每当我尝试启动它时,我都会收到错误消息

Traceback (most recent call last):
  File "main.py", line 78, in <module>
    application.listen(8080)
  File "/usr/local/lib/python2.7/dist-packages/tornado-3.0.1-py2.7.egg/tornado/web.py", line 1343, in listen
    server.listen(port, address)
  File "/usr/local/lib/python2.7/dist-packages/tornado-3.0.1-py2.7.egg/tornado/tcpserver.py", line 113, in listen
    sockets = bind_sockets(port, address=address)
  File "/usr/local/lib/python2.7/dist-packages/tornado-3.0.1-py2.7.egg/tornado/netutil.py", line 69, in bind_sockets
    sock = socket.socket(af, socktype, proto)
  File "/usr/lib/python2.7/socket.py", line 187, in __init__
    _sock = _realsocket(family, type, proto)
socket.error: [Errno 97] Address family not supported by protocol

我有理由确定我做的一切都正确

  • 我试图监听的端口没有在使用中
  • 我没有指定地址,但似乎我不需要,因为Tornado“hello world”也没有(该演示应用程序本身也没有运行;它给出了完全相同的错误,但行号不同)
  • 同一个应用似乎在 x86 和 x86_64 机器上运行良好

我需要在 ARM 上进行不同的调用吗,或者这是 tornado/socket.py 中的某个错误?有可用的解决方法吗?

由于它似乎是相关的,因此 Pi 正在运行此页面上最新的 Raspbian 映像(几天前从第二个镜像下载,所以不再最新的了)。我目前正在尝试旧版本,如果不起作用,我会尝试最新版本。

4

1 回答 1

7

事实证明,这与 ARM 无关。根据他的评论中链接的答案 ,如果您启动它的系统支持 IPv6,Tornado似乎会感到困惑,这显然包括 Raspberry Pi。artless noise

启动服务器

application.listen(8080, '0.0.0.0')

而不仅仅是

application.listen(8080)

为我解决了这个问题。

EDIT2:对于跨平台开发人员:我之前概述的策略实际上不起作用。application.listen即使调用错误(这似乎可能是 Tornado 中的错误),调用也会绑定指定的端口。换句话说,您需要在调用listen.

由于我在 GNU/Debian 上运行我的应用程序,因此以下内容对我来说效果很好:

def listen(port):
    (osName, machineName, osRelease, osVersion, machineType) = os.uname()
    if re.search("arm", machineType):
        logging.info("Running on ARM...")
        application.listen(port, '0.0.0.0')
    else:
        logging.info("Running on x86...")
        application.listen(port)

不知道这个解决方案在其他操作系统或架构下有多可靠。

于 2013-05-08T22:46:42.110 回答