m00*_*0am 5 python setuptools setup.py bokeh
我提供了一个工具作为我的python包的一部分,使用散景可视化参数空间.启动它的正常方法是:
$ bokeh serve --show my_package/tools/my_tool.py
Run Code Online (Sandbox Code Playgroud)
这将打开浏览器并显示交互式图.但是,当我使用pip/PyPI安装此软件包时,用户无法轻松访问此文件夹,因此我想在setup.py中为此提供一个入口点.
包装布局:folder
|
|--- my_package
|     |
|     |- __init__.py
|     |- __main__.py
|     |- some_code.py
|     |
|     +--- tools
|           |
|           +--- my_tool.py
|
+--setup.py
Run Code Online (Sandbox Code Playgroud)
在我的setup.py中,我已经指定了main方法的入口点:
setup.pyfrom setuptools import setup, find_packages
setup(
    name = "my_package",
    packages = find_packages(),
    entry_points = {
        'console_scripts': [
            'my_package = my_package.__main__:main'
          ]
    },
    [...],
)
Run Code Online (Sandbox Code Playgroud)
但是,我发现启动散景服务器并显示界面的唯一方法是创建另一个这样的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()
Run Code Online (Sandbox Code Playgroud)
将它放在tools文件夹中,并为此脚本main方法创建一个入口点.*颤抖*必须有一个更好的方法来做到这一点.
是否可以使用setuptools提供这种入口点,还是有另一种方法来实现这种行为?
为了扩展@jxramos的答案,我修改了页面上给出的独立嵌入示例.通过在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()
Run Code Online (Sandbox Code Playgroud)
然后可以从命令行调用此脚本
$ python my_tool.py
Run Code Online (Sandbox Code Playgroud)
因此可用于预期的入口点:
[...]
entry_points = {
    'console_scripts': [
        'my_package = my_package.tools.my_tool:main'
      ]
},
[...]
Run Code Online (Sandbox Code Playgroud)
以下是我从我编写的文档示例中移植的更完整的示例.由于文档正在逐步淘汰,我认为它更适合作为这个答案的一部分.
为了使背景虚化的一个应用就像一个被执行正常的 .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()
Run Code Online (Sandbox Code Playgroud)
该文件可以执行
$ python local_server.py
Run Code Online (Sandbox Code Playgroud)
运行服务器并自动启动浏览器以显示文档.
为了提供一个可以使用setup.py轻松安装和调用的脚本.考虑以下文件夹结构:
project
??? setup.py
??? my_package
    ??? __init__.py
    ??? local_server.py
Run Code Online (Sandbox Code Playgroud)
内容setup.py:
from setuptools import setup
setup(
    name = "my_package",
    entry_points={
        "console_scripts": ["my_script = my_package.local_server:main"],
    },
)
Run Code Online (Sandbox Code Playgroud)
使用时安装包
$ python setup.py install
Run Code Online (Sandbox Code Playgroud)
然后你可以使用这个电话
$ my_script
Run Code Online (Sandbox Code Playgroud)
启动散景应用程序并自动启动显示文档的浏览器.
如果我没记错的话,您可以使用嵌入式服务器路线,该路线作为库文档包含在嵌入式 Bokeh 服务器中。在文档的该部分之后,有一个关于使用 bokeh 服务器客户端 api 的后续行。听起来他们正在研究未来连接到服务器的更多方法以及讨论用例的部分。