python - ARM 上的 Tornado socket.error

标签 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 上进行不同的调用,或者这是 tornado/socket.py 中某处的错误?有可用的解决方法吗?

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

最佳答案

事实证明这与ARM无关。根据 the answer 朴实无华的噪音在他的一条评论中有链接,看起来如果您启动它的系统支持 IPv6,Tornado 就会感到困惑,这显然包括 Raspberry Pi。

启动服务器

application.listen(8080, '0.0.0.0')

不仅仅是

application.listen(8080)

为我解决了这个问题。

EDIT2:对于跨平台开发人员:我之前概述的策略实际上不起作用。调用 application.listen 绑定(bind)指定的端口,即使调用错误(这似乎是 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)

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

关于python - ARM 上的 Tornado socket.error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16153804/

相关文章:

python - 生成具有 2 个不同 y 轴和由另一个变量着色的点的图的最有效方法

python - 如何强制 Tornado websockets 在握手时生成错误页面

python - Raspberry Pi和Python(TKinter和Omxplayer)

audio - 如何使用距离传感器改变声音

python - 如何使用 CommentedMap 对 YAML 进行递归排序?

python - 遍历两个不同长度的列表

python - Python 卡住集的持久哈希

python - 如何在 python 中将字符串转换为 ip 地址

django - 为Django项目选择一个好的异步解决方案

php - 在已安装的 apache2 服务器上安装 php