有没有办法将 Python 变量传递给 Javascript 而无需将其写入文件?

Posted

技术标签:

【中文标题】有没有办法将 Python 变量传递给 Javascript 而无需将其写入文件?【英文标题】:Is there a way to pass a Python variable to Javascript without writing it to a file? 【发布时间】:2019-10-30 02:29:00 【问题描述】:

假设我有一个简单的 Python 变量,如下所示:

x = 5

我想创建一个网页,该网页使用 javascript 来进一步处理该变量,在同一台计算机(Raspberry Pi)上运行。

<!DOCTYPE html>
<html>
<body>

<script>
document.write(x);
</script>

</body>
</html>

因为 Raspberry Pi 使用 micro SD 卡,所以我想限制读/写周期数。有没有办法将这个 Python 变量存储在 Javascript 代码可以访问的内存中(或其他方式)?

我知道有些人会建议用 Javascript 重写 Python 代码,但我已经有一个大型 Python 程序,由于时间和创建它所涉及的原始工作,我不想重写它。如果你很好奇,我正在使用 Javascript 来显示带有 Highcharts 的数据——这对于我的项目来说是首选。

【问题讨论】:

你在使用任何python框架吗?像 Django 或 Flask... 我同意某些上下文可能有助于更好地解决问题。 不,我对这两个框架都不熟悉。也许是时候学习了。 【参考方案1】:

几个想法:

    在您的 Python 应用程序中运行一个 Web 服务器并公开一个返回该数据的端点。在您的 Javascript 应用程序中,调用此 API(可通过 0.0.0.0 访问)并使用数据。警告:您必须在 Python 应用中设置网络服务器并保持其运行。

这是一个更好的主意:

    在您的 Pi 上运行 Redis 实例。 Redis 是一个内存缓存提供程序,您可以将其配置为不将任何数据持久化到磁盘。因此,它将成为您的 Python 和 Javascript 应用程序之间的内存代理。 Redis 在您的 Pi 上作为本地 Web 服务器运行,并公开用于写入和读取数据的端点。从您的 Python 应用程序调用 Redis 端点以写入一些数据,并从您的 Javascript 应用程序调用 Redis 以读取您需要的内容。

https://redis.io/topics/ARM

【讨论】:

我喜欢有一个中间选项的方法,它不会直接干扰两个已经存在的部分中的任何一个。虽然我不详细了解redis,但似乎是个不错的选择。【参考方案2】:

我想不出实现这一目标的直接方法。但我认为你可以在双方都使用socket-io 并通过它进行通信。

编辑:

正如 S.Pellegrino 所指出的,根据 op 的需求,从问题中所谓的“大型 Python 程序”构建 REST API 可能是一个不错的选择。

【讨论】:

如果它不必是实时的,你可以只公开一个 REST API 来访问你的 python 程序的内部状态(直接从你的 python 脚本内部),然后从你的 js 中查询它。 @S.Pellegrino 是的,您指出这一点很好。根据 op 的需求,在他所谓的“大型 Python 程序”之上构建一个 rest api 也可能是一个很好的解决方案。【参考方案3】:

您可以在 URL 中传递变量。

使用 JavaScript,您可以提取 URL 参数。例如,请参阅此回复:https://***.com/a/50769370/2223027

【讨论】:

据我们所知,没有网址。如果有,我认为解析请求不是一个好的选择,除非端点本身有意义,但是从端点获取数据不是操作所要求的。我认为您的回答没有解决问题。 @89f3a1c 页面有document.location,为什么说没有网址?根据“Is there a way to store this Python variable in memory (or some other way) that can be used by the Javascript code?”,看起来该值可能不会经常更改,因此将其作为 URL 传递可能是选项。如果不是,我同意 Redis 方法更有意义。

以上是关于有没有办法将 Python 变量传递给 Javascript 而无需将其写入文件?的主要内容,如果未能解决你的问题,请参考以下文章