为了扩展the answer of @jxramos,我修改了页面上给出的standalone embed example。通过在 main 函数中自己管理 tornado IO 循环,您可以使散景脚本的行为类似于 普通 python 脚本,该脚本在执行时会自动启动浏览器。
from tornado.ioloop import IOLoop
from bokeh.application.handlers import FunctionHandler
from bokeh.application import Application
from bokeh.server.server import Server
def modify_doc(doc):
"""Function that modifies a document."""
# [...] create a plot
doc.add_root(plot)
doc.title = "Test Plot"
def main():
"""Launch the server and connect to it."""
io_loop = IOLoop.current()
bokeh_app = Application(FunctionHandler(modify_doc)) # pass the function that assembles your document here.
server = Server({"/": bokeh_app}, io_loop=io_loop)
server.start()
print("Opening Bokeh application on http://localhost:5006/")
io_loop.add_callback(server.show, "/")
io_loop.start()
main()
然后可以从命令行调用此脚本
$ python my_tool.py
因此被用作预期的入口点:
[...]
entry_points = {
'console_scripts': [
'my_package = my_package.tools.my_tool:main'
]
},
[...]
普通版
以下是我从我编写的文档示例中移植过来的更完整示例。由于文档正在逐步淘汰,我认为它更适合作为此答案的一部分。
带有控制台入口点的本地散景服务器
要允许像 普通 .py 文件一样执行散景应用程序,您需要在应用程序中处理龙卷风 IOloop,如 here 所述。像这样的独立散景应用程序可用于在setup.py 中实现控制台脚本入口点。
但是,这需要散景版本 >= 0.12.4。
散景应用
考虑文件local_server.py:
from tornado.ioloop import IOLoop
from bokeh.application.handlers import FunctionHandler
from bokeh.application import Application
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.server.server import Server
def modify_doc(doc):
"""Add a plotted function to the document.
Arguments:
doc: A bokeh document to which elements can be added.
"""
x_values = range(10)
y_values = [x ** 2 for x in x_values]
data_source = ColumnDataSource(data=dict(x=x_values, y=y_values))
plot = figure(title="f(x) = x^2",
tools="crosshair,pan,reset,save,wheel_zoom",)
plot.line('x', 'y', source=data_source, line_width=3, line_alpha=0.6)
doc.add_root(plot)
doc.title = "Test Plot"
def main():
"""Launch the server and connect to it.
"""
print("Preparing a bokeh application.")
io_loop = IOLoop.current()
bokeh_app = Application(FunctionHandler(modify_doc))
server = Server({"/": bokeh_app}, io_loop=io_loop)
server.start()
print("Opening Bokeh application on http://localhost:5006/")
io_loop.add_callback(server.show, "/")
io_loop.start()
main()
这个文件可以执行
$ python local_server.py
它运行服务器并自动启动浏览器来显示文档。
入口点和 setup.py
>
为了提供一个可以使用 setup.py 轻松安装和调用的脚本。考虑以下文件夹结构:
project
├── setup.py
└── my_package
├── __init__.py
└── local_server.py
setup.py的内容:
from setuptools import setup
setup(
name = "my_package",
entry_points={
"console_scripts": ["my_script = my_package.local_server:main"],
},
)
使用安装包时
$ python setup.py install
然后你可以使用调用
$ my_script
启动散景应用程序并自动启动显示文档的浏览器。