python - Cherrypy 和交互式 Python

标签 python ipython jupyter-notebook cherrypy spyder

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

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/

相关文章:

python - 将用户名存储在Google App Engine上,而不是每次都调用get_current_user?

python - 使用 pyinstaller 时出现“No module named util”错误

python - 如何将 HTML 嵌入到 IPython 输出中?

python - 如何通过Python在GDB中通过正则表达式设置断点

python - matplotlib set_rmax 和 set_rticks 不工作

python - ipython 在不破坏目标文件中定义的全局变量的情况下运行

visual-studio-code - 合并 VSCode jupyter notebook 中的单元格?

python - 如何在服务器上运行 OpenAI Gym .render()

python - Bokeh - 从 BoxZoomTool/ResetTool 触发 on_change 回调

Python 3 pandas 使用字符串与正则表达式标记数据框中的数据