散景服务器的入口点

时间:2017-03-22 17:11:34

标签: python setuptools bokeh setup.py

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

$ 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中,我已经指定了main方法的入口点:

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文件夹中,并为此脚本main方法创建一个入口点。 * 不寒而栗 *必须有更好的方法来做到这一点。

是否可以使用setuptools提供此类入口点,还是有其他方法可以实现此行为?

2 个答案:

答案 0 :(得分:5)

要展开the answer of @jxramos,我修改了页面上给出的standalone embed example。通过在main函数中自己管理龙卷风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文件一样执行散景应用程序,您需要在应用程序中处理tornado 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

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

答案 1 :(得分:1)

如果我没弄错,你可以使用Embedding Bokeh Server as a Library文件中涵盖的嵌入式服务器路由。关于在文档的这一部分之后使用散景服务器客户端api,有一个跟进线。听起来他们正在研究更多连接服务器的方法,以及他们讨论用例的部分。