【问题标题】:Why cannot python call Javascript() from within a python function?为什么 python 不能从 python 函数中调用 Javascript()?
【发布时间】:2019-09-10 10:02:07
【问题描述】:

我使用Download CSV from an iPython Notebook 建议的代码动态构建 javascript 代码,并在从 jupyter notebook 调用时使用 python 中的 Javascript() 将其传递给浏览器。代码效果很好。如果我在 python 函数中嵌入相同的代码并从同一个 jupyter notebook 调用 python 函数,则 python 中的调用 Javascript() 不再有效。如何使可重用功能发挥作用?

我正在 Windows 10 上运行的 Chrome 版本 73.0.3683.103(官方构建)(64 位)上尝试此操作。如果已经回答,请致歉。我已经搜遍了 SO 和谷歌。

这行得通..

from IPython.display import Javascript
js_download = """
var csv = '%s';

var filename = 'results.csv';
var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
if (navigator.msSaveBlob) { // IE 10+
    navigator.msSaveBlob(blob, filename);
} else {
    var link = document.createElement("a");
    if (link.download !== undefined) { // feature detection
        // Browsers that support HTML5 download attribute
        var url = URL.createObjectURL(blob);
        link.setAttribute("href", url);
        link.setAttribute("download", filename);
        link.style.visibility = 'hidden';
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
}
""" % data_in_dataframes.to_csv(index=False).replace('\r','\\r').replace('\n','\\n').replace("'","\'")
Javascript(js_download)

这不起作用,它无法执行 Javascript(js_download),但它也没有给出我在 jupyter notebook 和浏览器中的 java 控制台中看到的任何错误。就好像它从未执行过 Javascript(js_download)。

from IPython.display import Javascript
def js_download_csv(df_download, s_filename='results.csv'):
    js_download =   """
    var csv = '%s';
    var filename = '%s';
    var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
    if (navigator.msSaveBlob) { // IE 10+
        navigator.msSaveBlob(blob, filename);
    } else {
        var link = document.createElement("a");
        if (link.download !== undefined) { // feature detection
            // Browsers that support HTML5 download attribute
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", filename);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
    """ % (df_download.to_csv(index=False).replace('\r','\\r').replace('\n','\\n').replace("'","\'"), s_filename)
    Javascript(js_download)
    return None
js_download_csv(df_download, s_filename)

抱歉,如果我遗漏了任何明显的内容。我找不到任何错误或日志,其中包含有关正在发生的事情的任何信息。

欢迎提出任何建议。

【问题讨论】:

  • 没有输出吗?
  • Python 本身并没有真正内置的 JavaScript 解释器。但是如果你想从 Python 调用 JavaScript,你应该使用PythonWebKit
  • jupyter notebook没有输出,浏览器java控制台没有输出,anaconda服务器窗口没有输出。。我在之前的函数中添加了打印语句JavaScript() 调用和字符串打印出来很好,可以直接在笔记本中使用。
  • 就好像 JavaScript() 在 jupytwr notebook 中可以很好地交互工作,但不能从同一个 jupyter notebook 中的函数调用。我不知道为什么。
  • 我发现了一些很奇怪的东西。如果我在对 Javascript(js_download) 的调用末尾添加一个分号,则可以在笔记本中运行的代码中添加分号。它停止工作!我认为分号在 python 中是多余的。为什么这会影响对 Javascript() 的调用?

标签: javascript python jupyter-notebook


【解决方案1】:

我找到了部分答案,虽然我不知道为什么会出现这个问题,但我已经找到了克服它的方法。在https://medium.com/@tomgrek/reactive-python-javascript-communication-in-jupyter-notebook-e2a879e25906 中,我们在文章中看到了以下问题:

一个大问题:某处需要返回 Javascript 作为其输出,否则它不会在笔记本中执行。

因此,如果我们将代码更改为以下内容(即返回 Javascript 调用),它就可以工作。

from IPython.display import Javascript
def js_download_csv(df_download, s_filename='results.csv'):
    js_download =   """
    var csv = '%s';
    var filename = '%s';
    var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
    if (navigator.msSaveBlob) { // IE 10+
        navigator.msSaveBlob(blob, filename);
    } else {
        var link = document.createElement("a");
        if (link.download !== undefined) { // feature detection
            // Browsers that support HTML5 download attribute
            var url = URL.createObjectURL(blob);
            link.setAttribute("href", url);
            link.setAttribute("download", filename);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        }
    }
    """ % (df_download.to_csv(index=False).replace('\r','\\r').replace('\n','\\n').replace("'","\'"), s_filename)
    return Javascript(js_download)
js_download_csv(df_download, s_filename)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多