我可能不应该这样做,但我很好奇。给出下面的样板代码:
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
并完成解释器,则解释器将“挂起”,等待 cherrypy
正在使用的线程。因此,请先停止发动机。
我刚刚使用 IPython 笔记本对此进行了测试,并且工作正常。
关于python - Cherrypy 和交互式 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31259369/