当我运行CherryPy Hello World时:
import cherrypy
class HelloWorld:
def index(self):
return "Hello world!"
index.exposed = True
cherrypy.config.update({'server.socket_port': 8080,})
cherrypy.quickstart(HelloWorld())
...我明白了:IOError:端口8080没有绑定在'localhost'上。它可能是什么?
答案 0 :(得分:10)
如果你试图在Heroku上部署CherryPy,在那里你不能使用环回来检查你是否真的打开了一个端口,那么你需要简单地禁用CherryPy的wait_for_occupied_port()
函数,以便CherryPy的自我一致性检查事实上,没有决定它没有开始。以下是我用来修复CherryPy的三行,以便它在Heroku上运行:
from cherrypy.process import servers
def fake_wait_for_occupied_port(host, port): return
servers.wait_for_occupied_port = fake_wait_for_occupied_port
答案 1 :(得分:7)
你可能还有其他东西正在监听该端口。
在Linux上执行:
netstat -pnl | grep 8080
看看8080上正在听什么过程
在Windows上使用类似TCPView的内容来执行相同操作。
答案 2 :(得分:3)
正如Jason R. Coombs所写,禁用环回设备存在问题。 heroku.com已禁用环回,因此CherryPy将崩溃。我filed a bug为此。
答案 3 :(得分:2)
我昨天在Ubuntu Linux服务器上遇到了这个问题。在我意识到错误消息非常通用之前,我花了几个小时试图追踪CherryPy代码中的错误。即使主机不拥有服务器尝试绑定的IP地址,它也会给出此错误消息。在我的例子中,环回接口(lo,127.0.0.1)被禁用。因此,即使我设置server.socket_host='0.0.0.0'
,检查端口wait_for_occupied_port
的尝试也会失败(因为它合理地假设环回接口始终可用)。重新启用环回接口后,CherryPy服务器将正常启动。
更新:CherryPy 3.2.3针对此特定问题进行了修复。在3.2.3发布之前,CherryPy project downloads上提供了开发版本。
答案 4 :(得分:1)
答案 5 :(得分:1)
我认为当我开始使用CherryPy时遇到了类似的问题...但我不记得究竟是什么......但修复涉及使用配置文件而不是手动传递配置:
MyProj.conf:
[global] server.socket_host = "127.0.0.1" server.socket_port = 8080 server.thread_pool = 10
MyProj.py
import os
import cherrypy
class HelloWorld:
def index(self):
return "Hello world!"
index.exposed = True
# Assumes the config file is in the directory as the source.
conf_path = os.path.dirname(os.path.abspath(__file__))
conf_path = os.path.join(conf_path, "MyProj.conf")
cherrypy.config.update(conf_path)
cherrypy.quickstart(HelloWorld())
这绝对适用于此。
我正在使用Python 2.6.1和CherryPy 3.1.1,我使用-W ignore
运行脚本:
c:\My_path> python -W ignore MyProj.py
如果您在* nix下,则应将-W ignore
放在文件顶部的#!
评论中。
答案 6 :(得分:1)
如果您使用的是OS X,请尝试拨打:
sudo lsof -i :8080
将告诉您使用该端口的过程。
答案 7 :(得分:0)
AVG Anti-Virus给我造成了这个问题。卸载AVG(远非理想)就可以了。我怀疑链接扫描仪无法禁用。
答案 8 :(得分:0)
在使用Python 3.3在我的Win7 PC上运行CherryPy 3.2.2时遇到了同样的问题 服务器将正常启动,然后在大约几分钟内崩溃。
我已经应用了提到的CherryPy 3.2.3 laurasia中的patch。但它没有帮助。
所以我必须在python\Lib\site-packages\cherrypy\process\servers.py
的末尾注释掉引发错误的行,以防止服务器死亡:
...
# if host == client_host(host):
# raise IOError("Port %r not bound on %r" % (port, host))
...
答案 9 :(得分:0)
如果您收到打印到stdio的python异常,表明8080在127.0.0.1上不是免费的,那么您将执行以下操作:
netstat -o -a
Windows命令提示符下的。单独执行netstat -o
会给您错误的PID。
在第一列的地址字符串中查找8080。找到后,水平转到最后一列,即PID(进程ID)。
现在要终止进程,我使用kill <PID>
,它是mysys安装的一部分。我通过在系统上执行where kill
来发现这一点。
因此一起:
netstat -o -a
[find PID then hit ctrl-c to stop netstat]
kill 13164
其中13164是第一步中找到的示例PID。
如果没有安装mysys,请安装它,否则请查找如何在Windows上通过其PID终止进程。