当从jupyter笔记本中调用时,我使用了Download CSV from an iPython Notebook中建议的代码来动态构建javascript代码,并使用python中的Javascript()将其传递给浏览器。代码效果很好。如果我将相同的代码嵌入python函数中,并从同一jupyter笔记本中调用python函数,则python中的Javascript()调用将不再起作用。如何使可重用功能正常工作?
我正在Windows 10上运行的Chrome版本73.0.3683.103(正式版本)(64位)上尝试此操作。如果已经回答,抱歉。我已经搜索过SO和Google。
这有效。.
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笔记本或浏览器中的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)
很抱歉,如果我没有提出任何明显的建议。我找不到任何有关正在发生的信息的错误或日志。
欢迎提出任何建议。
答案 0 :(得分: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)