散景服务器的入口点

Entry point for a bokeh server

我提供了一个工具作为我的 python 包的一部分,它使用散景可视化参数 space。启动它的正常方式是:

$ bokeh serve --show my_package/tools/my_tool.py

打开浏览器并显示交互图。 但是,当我使用 pip/PyPI 安装此包时,用户无法轻松访问此文件夹,因此我想在 setup.py.

中为此提供一个入口点 包装布局:
folder
|
|--- my_package
|     |
|     |- __init__.py
|     |- __main__.py
|     |- some_code.py
|     |
|     +--- tools
|           |
|           +--- my_tool.py
|
+--setup.py

在我的 setup.py 中,我已经为我的主要方法指定了一个入口点:

setup.py
from setuptools import setup, find_packages

setup(
    name = "my_package",
    packages = find_packages(),
    entry_points = {
        'console_scripts': [
            'my_package = my_package.__main__:main'
          ]
    },
    [...],
)

但是,我发现启动散景服务器并显示界面的唯一方法是创建另一个 python 脚本,如下所示

import os
from subprocess import call

def main():
    p = os.path.realpath(__file__)
    prefix, _ = os.path.split(p)
    bokeh_server_file = os.path.join(prefix, "my_tool.py")
    call(["bokeh", "serve", "--show", bokeh_server_file])

if __name__ == "__main__":
    main()

将它放在 tools 文件夹中并为此脚本主要方法创建一个入口点。 *不寒而栗*必须有更好的方法来做到这一点。

是否可以使用 setuptools 提供这种入口点,或者是否有其他方法可以实现这种行为?

如果我没记错的话,您可以使用 Embedding Bokeh Server as a Library 文档中介绍的嵌入式服务器路线。在文档的该部分之后有关于使用散景服务器客户端 api 的后续行。听起来他们正在研究未来连接服务器的更多方法以及他们讨论用例的部分。

扩展页面上给出的 , I modified the standalone embed example。通过在 main 函数中自己管理 tornado IO 循环,您可以使散景脚本的行为类似于 normal 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

启动散景应用程序并自动启动显示文档的浏览器。