Bokeh Mac execution error 解决方案

当使用bokeh output_file之后,show()函数无法正常打开html文件,同时爆出两行错误:
0:115: execution error: 找不到文件“某个对象”。 (-43)
69:77: execution error: 不能获得“application "chrome"”。 (-1728)

通过搜索后找到一个类似的问题,其中提到了BOKEH_BROWSER
进入python环境

import bokeh
print(bokeh.settings) # 获取路径
# <module 'bokeh.settings' from '/Users/void_yt_main/opt/anaconda3/lib/python3.7/site-packages/bokeh/settings.py'>

打开文件/Users/void_yt_main/opt/anaconda3/lib/python3.7/site-packages/bokeh/settings.py,搜索BOKEH_BROWSER,修改参数default、dev_default默认值
browser = PrioritizedSetting("browser", "BOKEH_BROWSER", default=None, dev_default="none", help="""->
browser = PrioritizedSetting("browser", "BOKEH_BROWSER", default='Safari', dev_default="safari", help="""
重新导入bokeh模块,问题解决。

题外话:从Bokeh源码来看,show函数默认browser=None,调用_show_with_state,而后者通过get_browser_controller获取浏览器,该函数检查settings.browser参数

def get_browser_controller(browser=None):
    ''' Return a browser controller.

    Args:
        browser (str or None) : browser name, or ``None`` (default: ``None``)
            If passed the string ``'none'``, a dummy web browser controller
            is returned

            Otherwise, use the value to select an appropriate controller using
            the ``webbrowser`` standard library module. In the value is
            ``None`` then a system default is used.

    Returns:
        controller : a web browser controller

    '''
    browser = settings.browser(browser)

    if browser is not None:
        if browser == 'none':
            controller = DummyWebBrowser()
        else:
            controller = webbrowser.get(browser)
    else:
        controller = webbrowser

    return controller

后面_show_file_with_state函数对controller的调用为controller.open("file://" + filename, new=NEW_PARAM[new])
因此,默认实际上是调用webbrowser.open(...),bug在webbrowser.open中
当设置参数default、dev_default默认值后,使用的则是webbrowser.get('Safari'),这样就没有错误了

发表评论