CherryPy Hello World 错误
Posted
技术标签:
【中文标题】CherryPy Hello World 错误【英文标题】:CherryPy Hello World error 【发布时间】:2010-10-20 12:50:40 【问题描述】:当我运行 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: Port 8080 not bound on 'localhost'。会是什么?
【问题讨论】:
我以前遇到过这个问题。我希望这个问题会对某人有所帮助。 【参考方案1】:你可能在那个端口上监听了其他东西。
在 Linux 上:
netstat -pnl | grep 8080
然后看看 8080 上监听的是什么进程
在 Windows 上使用 TCPView 之类的东西来做同样的事情。
【讨论】:
【参考方案2】: 在不同的端口(例如 8000)上使用它 阅读ConfigApi(再次) 尝试最新版本,而不是 3.0 这也可能是由某些 Windows 防火墙(Eset smart security 或其他)引起的。所以只需在不同的端口上使用它。【讨论】:
【参考方案3】:我想我在开始使用 CherryPy 时遇到了类似的问题...但我不记得确切是什么...但是修复涉及使用配置文件而不是手动传递配置:
MyProj.conf:
[全球的] server.socket_host = "127.0.0.1" server.socket_port = 8080 server.thread_pool = 10MyProj.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
运行脚本:
如果您使用 *nix,则应将 -W ignore
放在文件顶部的 #!
注释中。
【讨论】:
“-W 忽略”是因为 CherryPy 3.1.1 还没有完全准备好 Python 2.6;但它仍然足以满足我们这里的内部需求。【参考方案4】:AVG Anti-Virus 给我造成了这个问题。卸载 AVG(远非理想)就可以了。我怀疑我无法禁用的链接扫描器。
【讨论】:
【参考方案5】:我昨天在 Ubuntu Linux 服务器上遇到了这个问题。在我意识到错误消息非常笼统之前,我花了几个小时试图找出 CherryPy 代码中的错误。即使主机不拥有服务器尝试绑定的 IP 地址,它也会给出此错误消息。在我的情况下,环回接口(lo,127.0.0.1)被禁用。因此,即使我设置了server.socket_host='0.0.0.0'
,检查端口wait_for_occupied_port
的尝试也会失败(因为它合理地假设环回接口始终可用)。重新开启loopback接口后,CherryPy服务器就可以正常启动了。
更新:CherryPy 3.2.3 修复了这个特定问题。在 3.2.3 发布之前,CherryPy project downloads 上提供开发版本。
【讨论】:
【参考方案6】:正如Jason R. Coombs 所写,禁用的环回设备存在问题。 heroku.com 已禁用环回,因此 CherryPy 将崩溃。我为此filed a bug。
更新:Reported as resolved.
【讨论】:
【参考方案7】:如果你尝试在 Heroku 上部署 CherryPy,你无法使用 loopback 来检查你是否真的打开了一个端口,那么你只需要简单地禁用 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
【讨论】:
虽然这个答案非常有用,但它确实不属于这里,因为它与 OP 的原始问题几乎没有关系。在这种情况下,对您非常有价值的答案问一个更详细和具体的问题更为合适,然后当然,回答它:)。我意识到其他人在这里对这个问题有类似的答案......但它更像是线程劫持而不是任何事情。 我的回答是运行那个 exact 脚本并得到那个 exact 错误。我看不出这与这个问题“几乎没有关系”。您可以从@laurasia 的回答中看到,其他人认为我的回答也与这个问题相关。 是的,刚刚确认我确实得到了 IOError 和 ChannelFailures:IOError,有时,有时我只是得到 SIGTERM。所以,你是对的,我对“很少做”的评论是错误的。有时没有错误是我困惑的原因。不过,我仍然会稍微倾向于新线程;) 太棒了! Mokeypatch soultion ---> 如果您在 iptables 中进行 MASQUERADE,也可以使用!【参考方案8】:我在装有 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))
...
【讨论】:
我有同样的问题,同样的设置,只在 OS X 上。我只是在同一个文件中注释掉了最后一行。raise IOError("Port %r not bound on %r" % (port, host))
【参考方案9】:
如果您使用的是 OS X,请尝试调用:
sudo lsof -i :8080
它会告诉你使用那个端口的进程。
【讨论】:
【参考方案10】:Windows 10
如果你得到一个 python 异常打印到 stdio 表明 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 杀死进程。
【讨论】:
以上是关于CherryPy Hello World 错误的主要内容,如果未能解决你的问题,请参考以下文章
错误的函数数量和警告:函数 hello_world/0 未使用
Visual Studio 2015“Hello World”多个错误