我正在尝试使用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
我有理由相信我做的一切都很正确
我需要在ARM上进行不同的调用,还是龙卷风/ socket.py中的某个错误?有可用的解决方法吗?
由于它似乎是相关的,Pi正在运行来自this page的最新Raspbian图像(几天前从第二个镜像下载,所以不再 最新版本)。我目前正在尝试使用旧版本,如果不起作用,我会尝试最新版本。
答案 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)
不知道此解决方案在其他操作系统或体系结构下的可靠性。