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 笔记本测试了这个并且工作正常。
我可能不应该这样做,但我很好奇。给定以下样板代码:
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 笔记本测试了这个并且工作正常。