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 = 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 忽略 MyProj.py

如果您使用 *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 未使用

Docker hello-world:身份验证错误

Flask Hello World程序无效404找不到错误

Visual Studio 2015“Hello World”多个错误

使用可重定位设备代码编译 CUDA“hello, world”的分段错误

在 Python XAMPP 中执行简单的“Hello, world”时出现服务器错误 500 [关闭]