私は、パッケージ内にデプロイするbokeh
(0.12.6
)ユーティリティを使用して、対話的なデータ操作を行っています。ユーザーは、bokehサーバーを起動し、ブラウザーでアプリケーションを起動し、タブまたはブラウザーを閉じたときにサーバーを停止させるルーチンを実行することができるということです(module.utility()
)。bokehサーバーをプログラムで実行すると、ブラウザにローカルで表示されます
bokeh serve --show myapp
を実行するとアプリケーションが正常に起動しますが、以下で説明するメソッドを使用してローカルホストに接続するとハングアップします。私はハンドラを点検しました、すべてが見えるように見えます。
これは合理的なことですか、私はそれについて正しく行っていますか?
ディレクトリ形式./myapp
がvenv/lib/python3.5/site-packages/mymodule
などに存在します
<installed module path>/myapp
└── main.py
main.py
from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.plotting import figure
from bokeh.models.sources import ColumnDataSource
source = ColumnDataSource(dict(x=list(range(5)), y=list(range(5))))
p = figure(width=300, height=300, tools=[], toolbar_location=None)
p.line(x='x', y='y', source=source)
curdoc().add_root(column(p, sizing_mode='scale_width'))
実行スクリプト
def run_single_server(abs_app_path, port=5000):
'''Run bokeh application for single session from server`'''
from bokeh.application import Application
from bokeh.application.handlers import DirectoryHandler
from bokeh.server.server import Server
import os
app_name = os.path.split(abs_app_path)[1]
url = '/{}'.format(app_name)
# Start a bokeh server
apps = {url:Application(DirectoryHandler(filename=abs_app_path))}
server = Server(apps, port=port)
server.start()
server.show(url)
# somehow wait for session to end, perhaps using `server_lifecycle.py`
server.stop()
return
def utility():
import mymodule
module_path = os.path.split(mymodule.__file__)[0]
abs_app_path = os.path.join(module_path, 'myapp')
run_single_server(abs_app_path, port=5000)
return
はおそらくメイン__init__.py
でそのルーチンを持っており、それがこのように動作します:
import mymodule
mymodule.utility()
# 1. Browser launches
# 2. user does stuff
# 3. user closes window
# 4. bokeh server is shutdown
更新 私は、build_single_handler_application
ルーチンを発見していることを試してみましたそれはまた、ハングアップするように見えます。
from bokeh.command.util import build_single_handler_application
import os
app_name = os.path.split(abs_app_path)[1]
url = '/{}'.format(app_name)
# Start a bokeh server
apps = build_single_handler_application(abs_app_path)