散景服务器的入口点



我提供了一个工具作为我的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 中,我已经指定了主方法的入口点:

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 方法创建一个入口点。 *不寒而栗* 必须有更好的方法来做到这一点。

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

为了扩展@jxramos的答案,我修改了页面上给出的独立嵌入示例。通过在主函数中自行管理龙卷风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,如此处所述。像这样的独立散景应用程序可用于在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

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

如果我没记错的话,你可以选择嵌入式服务器路由,该路由在嵌入散景服务器作为库文档中介绍。在文档的这一部分之后,有一条关于使用散景服务器客户端 API 的后续行。听起来他们正在研究更多方法在未来连接到服务器,以及在他们讨论用例的部分。

相关内容

  • 没有找到相关文章

最新更新