以编程方式运行散景服务器以在本地浏览器中显示

2023-12-25

我正在进行交互式数据操作bokeh (0.12.6)我将在包中部署的实用程序。这个想法是用户可以运行一些例程module.utility()这将启动散景服务器,在浏览器中启动应用程序,当选项卡或浏览器关闭时,服务器将停止。

如果我运行,我的应用程序启动正常bokeh serve --show myapp,但是当使用下面描述的我的方法连接到本地主机时它会挂起。我检查了处理程序,一切看起来都正常。

这是合理的做法吗?我的做法正确吗?

目录格式

<installed module path>/myapp
└── main.py

Where ./myapp将居住在venv/lib/python3.5/site-packages/mymodule etc.

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

Update我找到了build_single_handler_application https://github.com/bokeh/bokeh/blob/master/bokeh/command/util.py#L40-L76常规并尝试过,但它似乎也挂起。

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)

看来我遇到了一些问题。我最终找到并改编了我在邮件组中找到的一些代码here https://groups.google.com/a/continuum.io/forum/#!msg/bokeh/LYmjTXzX43E/_0dNPR1_CQAJ对于我的用例。

我设法通过使用单独的进程来使一切正常工作:1)启动服务器,2)启动应用程序网址webbrowser,以及 3) 检查关闭的连接并关闭。

我想我也许可以取消启动tornado服务器实例就像我改编的烧瓶示例中所做的那样,但我在这里很高兴。

Note:此示例使用单文件应用程序,但您也可以传递目录格式应用程序的路径。

def create_bokeh_server(io_loop, files, argvs, host, port):
    '''Start bokeh server with applications paths'''
    from bokeh.server.server import Server
    from bokeh.command.util import build_single_handler_applications

    # Turn file paths into bokeh apps
    apps = build_single_handler_applications(files, argvs)

    # kwargs lifted from bokeh serve call to Server, with created io_loop
    kwargs = {
        'io_loop':io_loop,
        'generate_session_ids':True,
        'redirect_root':True,
        'use_x_headers':False,
        'secret_key':None,
        'num_procs':1,
        'host': host,
        'sign_sessions':False,
        'develop':False,
        'port':port,
        'use_index':True
    }
    server = Server(apps,**kwargs)

    return server


def run_single_app(files, port=5000, new='tab'):

    def start_bokeh(io_loop):
        '''Start the `io_loop`'''
        io_loop.start()
        return None

    def launch_app(host, app_name, new):
        '''Lauch app in browser

        Ideally this would `bokeh.util.browser.view()`, but it doesn't work
        '''
        import webbrowser

        # Map method strings to webbrowser method
        options = {'current':0, 'window':1, 'tab':2}

        # Concatenate url and open in browser, creating a session
        app_url = 'http://{}/{}'.format(host, app_name)
        print('Opening `{}` in browser'.format(app_url))
        webbrowser.open(app_url, new=options[new])

        return None

    def server_loop(server, io_loop):
        '''Check connections once session created and close on disconnect'''
        import time

        connected = [True,]
        session_loaded = False
        while any(connected):

            # Check if no session started on server
            sessions = server.get_sessions()
            if not session_loaded:
                if sessions:
                    session_loaded = True
            # Once 1+ sessions started, check for no connections
            else:
                # List of bools for each session
                connected = [True,]*len(sessions)
                # Set `connected` item false no connections on session
                for i in range(len(sessions)):
                    if sessions[i].connection_count == 0:
                        connected[i] = False
            # Keep the pace down
            time.sleep(2)

        # Stop server once opened session connections closed
        io_loop.stop()

        return None

    import os
    import threading
    import tornado.ioloop
    import tornado.autoreload
    import time

    # Initialize some values, sanatize the paths to the bokeh plots
    argvs = {}
    app_names = []
    for path in files:
        argvs[path] = None
        app_names.append(os.path.splitext(os.path.split(path)[1])[0])

    # Concate hostname/port for creating handlers, launching apps
    host = 'localhost:{}'.format(port)

    # Initialize the tornado server
    io_loop = tornado.ioloop.IOLoop.instance()
    tornado.autoreload.start(io_loop)

    # Add the io_loop to the bokeh server
    server = run_bokeh_server(io_loop, files, argvs, host, port)

    print('Starting the server on {}'.format(host))
    args = (io_loop,)
    th_startup = threading.Thread(target=start_bokeh, args=args)
    th_startup.start()

    # Launch each application in own tab or window
    th_launch = [None,]*len(app_names)
    for i in range(len(app_names)):
        args = (host, app_names[i], new)
        th_launch[i] = threading.Thread(target=launch_app, args=args)
        th_launch[i].start()
        # Delay to allow tabs to open in same browser window
        time.sleep(2)

    # Run session connection test, then stop `io_loop`
    args = (server, io_loop)
    th_shutdown = threading.Thread(target=server_loop, args=args)
    th_shutdown.start()

    return None

if __name__ == "__main__":

import os
files = [os.path.join('bokeh', fname) for fname in ['ex1.py','ex2.py']]
run_single_app(files, port=5006)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式运行散景服务器以在本地浏览器中显示 的相关文章

  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • Series.sort() 和 Series.order() 有什么区别?

    s pd Series nr randint 0 10 5 index nr randint 0 10 5 s Output 1 3 7 6 2 0 9 7 1 6 order 按值排序并返回一个新系列 s order Output 2 0
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • Python Tkinter 模块不显示输出

    我正在尝试学习 Python 并尝试使用 Python 中的 GUI 并遇到了这个 Tkinter 模块 我的代码运行 但运行时窗口没有出现 我的代码如下 from Tkinter import to create a root windo
  • Python HMAC:类型错误:字符映射必须返回整数、None 或 unicode

    我在使用 HMAC 时遇到了一个小问题 运行这段代码时 signature hmac new key secret key msg string to sign digestmod sha1 我收到一个奇怪的错误 File usr loca
  • 运行 Python 单元测试,以便成功时不打印任何内容,失败时仅打印 AssertionError()

    我有一个标准单元测试格式的测试模块 class my test unittest TestCase def test 1 self tests def test 2 self tests etc 我的公司有一个专有的测试工具 它将作为命令行
  • python中basestring和types.StringType之间的区别?

    有什么区别 isinstance foo types StringType and isinstance foo basestring 对于Python2 basestring是两者的基类str and unicode while type
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • Airflow 1.9 - 无法将日志写入 s3

    我在 aws 的 kubernetes 中运行气流 1 9 我希望将日志发送到 s3 因为气流容器本身的寿命并不长 我已经阅读了描述该过程的各种线程和文档 但我仍然无法让它工作 首先是一个测试 向我证明 s3 配置和权限是有效的 这是在我们
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar
  • 无法安装最新版本的 Numpy (1.22.3)

    我正在尝试安装最新版本的 numpy 即 1 22 3 但看起来 pip 无法找到最后一个版本 我知道我可以从源代码本地安装它 但我想了解为什么我无法使用 pip 安装它 PS 我有最新版本的pip 22 0 4 ERROR Could n

随机推荐

  • 无法使用 YAML Spring Profile 禁用 @Cacheable

    我创建了一个名为 mycache 的缓存 该缓存应用于我的服务中的方法 例如 Cacheable value mycache public String getValue String something breakpoint here 我
  • WKT中如何处理Circle?

    我有一个 json 对象 区域 圆形 28 625360369528934 77 2227479486792 3135 6 如何使用WKTreader解析它 你需要回到写下它的人那里并解释一下CIRCLE不属于WKT标准 http www
  • 存储设置的最佳实践

    我有一个相当大的 C 应用程序 在 Windows 上 没有计划其他平台 它当前将所有设置 甚至某种地址 存储在 Windows 注册表中 有时这很不方便 因为用户很难更改注册表中的条目 我希望对设置进行版本控制 以便设置始终与当前代码匹配
  • SPARQL 对聚合值应用 MAX [重复]

    这个问题在这里已经有答案了 我有这样的疑问 prefix
  • R闪亮-带有选项的弹出窗口

    我正在创建一个查询 SQL 数据库的闪亮应用程序 如果查询的数据有两个日期的条目 我想警告用户 此外 我希望用户能够选择要查询的数据集 这是一个例子 Server Create example data set seed 10 Measur
  • (如何)终端服务/远程桌面可以用来共享Access数据库吗?

    我以前使用过的唯一类型的 远程桌面 应用程序是 VNC 查看器 我对这种应用的理解是 当多个用户登录同一个VNC服务器时 他们共享键盘 鼠标和桌面 因此只有一个人可以实际使用计算机 而其他用户可以观看正在发生的事情 这显然有它自己的用途 我
  • Metastore_db 不是在 Windows 7 中使用 apache Spark 2.2.1 创建的

    我想使用最新的读取 CSV 文件Apache Spark Version i e 2 2 1 in Windows 7 via cmd但无法这样做 因为存在一些问题metastore db 我尝试了以下步骤 1 spark shell pa
  • 在逗号分隔列表上进行 Sub 和 Join

    我正在尝试构建一个 ECS Fargate 任务定义 该定义使用传递给命令的可变数量的环境变量 每个变量名称都与 SecretsManager 中的一个秘密相匹配 我无法以有意义的方式组合这些功能 以下代码只是将所有变量作为字符串列表传递给
  • 如何使 div *不*扩展以填充其父级?

    我有一个 div 包裹着图像 如下所示 div class containing div div class image wrapper img src image jpg div div class unrelated stuff Bla
  • Plotly:如何为所有子图设置xticks?

    我无法操纵所有子图上的 xticks 我正在使用的 xticks 方法 根据文档 仅更改最顶层子图的 xticks 如何更改下部子图的 xticks 下面是我的代码 fig make subplots rows 2 cols 1 fig a
  • PostgreSQL:如何索引所有外键?

    我正在使用一个大型 PostgreSQL 数据库 并且正在尝试调整它以获得更高的性能 我们的查询和更新似乎使用外键进行了大量查找 我想要的是一种相对简单的方法来向所有外键添加索引 而不必遍历每个表 140 并手动执行 在研究这个问题时 我发
  • 处理来自 ADFS 的 JWT 不记名令牌

    我正在测试一个 Web 应用程序 API 该 API 使用 X509 证书对 ADFS 服务器进行身份验证 为了使用空手道运行测试 我目前使用一个小型 NET 应用程序 该应用程序使用我安装的证书协商 JWT 进行 SSO 然后 我从 Fi
  • Javascript 相当于 iOS 的“tap”事件,但适用于 Android

    我正在使用 jqtouch 制作一个触摸优化网站 对于 iOS 我将 tap 绑定到点击侦听器 但这不会在 Android 中注册 我尝试使用 touchend 它可以工作 但它会覆盖任何类型的拖动 当用户试图做的只是滚动时单击项目 对于
  • C# 中的锁定关键字

    我从MSDN上了解到lock关键字的主要作用 lock 语句 C 参考 lock 关键字标记一条语句 块作为关键部分 获取互斥锁 对于给定的对象 执行 声明 然后发布 锁 什么时候应该使用锁 例如 它对于多线程应用程序很有意义 因为它可以保
  • 如何在 C# 中使网页浏览器控件变为空白?

    最初 当网络浏览器刚刚加载到表单上时 它是空白的 即白色 一旦我们进入某个特定网站 有没有办法让它再次变成空白 我尝试过这些方法 但没有找到一种可以实现这一点的方法 还有其他方法还是我错过了什么 尝试一下 webBrowser1 Navig
  • 使用“”的不可重现的随机数

    我正在尝试创建一个类 为多个分布生成随机数 同时保持它们的可重复性 通过设置初始种子 该代码似乎有效 直到我开始使用正态分布和奇怪的错误表面 这些主要是 如果我取消注释double a rnd rnorm 0 0 1 0 line 第40行
  • 项目模板中的列表视图视觉状态管理器(WinRT、Metro、XAML)

    我正在尝试获取一个列表视图来显示由文本块组成的项目列表 当单击列表视图项目时 我想显示一个由文本框组成的列表 以下是我想出来的 它不起作用 我在模板中有两个网格 希望根据是否选择列表视图项来简单地显示和隐藏网格 我哪里出错了 我从列表视图的
  • Qt 3D 数组与 QVector 等 Qt-Objekts

    如何仅使用 Qt Objects 创建 3D 数组 该数组应该是 3D 整数数组 我尝试在堆上创建一个标准的 3D 数组 在堆上分配内存效果很好 如果我想释放内存 我会遇到错误 const int scalefaktor 16 int an
  • 为什么 IOS5 中不推荐使用 Accelerometer:didAccelerate: ?

    iOS5的发布就有这个核心功能列为已弃用 https developer apple com library prerelease ios documentation UIKit Reference UIAccelerometerDeleg
  • 以编程方式运行散景服务器以在本地浏览器中显示

    我正在进行交互式数据操作bokeh 0 12 6 我将在包中部署的实用程序 这个想法是用户可以运行一些例程module utility 这将启动散景服务器 在浏览器中启动应用程序 当选项卡或浏览器关闭时 服务器将停止 如果我运行 我的应用程