ARM上的Tornado socket.error

时间:2013-04-22 18:08:29

标签: python tornado raspberry-pi

我正在尝试使用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上进行不同的调用,还是龙卷风/ socket.py中的某个错误?有可用的解决方法吗?

由于它似乎是相关的,Pi正在运行来自this page的最新Raspbian图像(几天前从第二个镜像下载,所以不再 最新版本)。我目前正在尝试使用旧版本,如果不起作用,我会尝试最新版本。

1 个答案:

答案 0 :(得分:7)

这与ARM无关。根据他的一条评论中链接的the answer artless noise,如果启动它的系统支持IPv6,那么看起来像就会感到困惑,这显然包括Raspberry Pi

使用

启动服务器
application.listen(8080, '0.0.0.0')

而不仅仅是

application.listen(8080)

为我解决了这个问题。

EDIT2 :对于跨平台开发人员:我之前概述的先前策略实际上不起作用。即使调用错误(看起来它可能是Tornado中的错误),调用application.listen也会绑定指定的端口。换句话说,您需要确定在调用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)

不知道此解决方案在其他操作系统或体系结构下的可靠性。