我正在尝试使用 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/