Cherrypy 和互动 python

Cherrypy and interactive python

我可能不应该这样做,但我很好奇。给定以下样板代码:

import cherrypy

class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())

如果我在 Ipython 控制台中输入此内容,服务器会提供该页面。如果我按 ctrl+c 或 cherrypy.server.stop() 服务器停止。没问题。

然而,当我尝试在 Spyder 或 Ipython Notebook 中做同样的事情时,我可以提供 "hello world" 就好了,但不能调用 cherrypy.server.stop() 或中断内核.

这是为什么?更好的是,有解决办法吗?

quickstart 方法阻塞调用的线程。

基本上它调用cherrypy.engine.block

但您也可以直接挂载您的应用程序并调用引擎上的方法。

>>> cherrypy.tree.mount(RootApp(), '')
>>> # you can do some config with cherrypy.config or on the mount third argument.
>>> cherrypy.engine.start()
>>> import webbrowser
>>> webbrowser.open('localhost:8080')

解释器不会被阻塞。您可以使用 cherrypy.engine.stop 停止引擎并重新启动。

但是,cherrypy 是基于线程的,可能会与另一个假定它可以控制所有线程的库发生冲突,因此请注意。

此外,如果您不调用 cherrypy.engine.stop 并完成解释器,解释器将 "hanged" 等待 cherrypy 正在使用的线程。所以先关掉引擎。

我刚刚用 IPython 笔记本测试了这个并且工作正常。