有没有办法使用像 react 这样的前端框架在浏览器客户端运行 Python 脚本?

Is there a way to run Python scripts client side in the browser using a front end framework like react?

提问人:Benji 提问时间:1/29/2022 更新时间:11/18/2022 访问量:1827

问:

介绍

在我看来,有很多很酷和有用的 python 脚本/程序,它们并没有发挥它们的潜力。因为所有这些都是在命令行中本地执行的,所以它们不是很用户友好,普通人也不太容易访问。我想创建一个可以在其上运行此类脚本的网站,但是从具有易于导航的 UI 的浏览器中,这样用户就不必下载文件即可使用该服务。

我的方法

尽管我已经花了很多时间学习 js,但我仍然是一个初学者,但我似乎不知道我如何能够做到这一点。 我想我可能必须设置一个可以在后端运行并将信息提供给前端的 API。但是,我要运行的特定脚本/文件称为 spleeter,它接收音频文件,并将它们拆分为词干。我确信可以通过 API 上传文件,但是我可以看到它变得非常繁重的服务器端,特别是如果很多人同时访问该网站。我非常天真地认为,这个本质上的可伸缩性问题可以通过在本地客户端运行脚本来解决,这样用户就不必上传任何东西,一石二鸟,从某种意义上说,我不必支付托管上传文件的服务器成本,也不必支付运行脚本的计算能力。 在搜索了这个话题一个星期后,我知道这确实是我非常幼稚的。我研究过一个叫做 Brython 的东西和一个叫做 Transcrypt 的东西,但不太明白它如何适用。

基本上是问题

所有这些解释基本上都提出了以下问题,我想做的事情是否可能?这种设置是否有一个我没有正确搜索的名称?如果可能的话,有人可以把我推向正确的方向吗?

我希望有一个解决方案,如果没有,我真的认为任何人都会把这个结合在一起。

JavaScript Python ReactJS API 客户端

评论

0赞 Luca Kiebel 1/29/2022
realpython.com/brython-python-in-browser/......

答:

1赞 Arthur 1/29/2022 #1

我自己还没有使用过这个工具,但 Brython 拥有这个功能。我将研究自己使用它,因为这是我一直期待使用的东西。

1赞 John S 1/31/2022 #2

我个人是 Transcrypt 的粉丝,我自己也用它来创建完整的 React 应用程序,这些应用程序是用 Python 而不是 JavaScript 编程的。但就像任何 React 应用程序一样,这确实需要将代码预编译为 JavaScript,然后才能在 Web 浏览器中运行。也就是说,多亏了 sourcemaps,您仍然可以在浏览器中对 Python 代码进行故障排除。

如果要在浏览器中源代码实际运行 Python 代码,可能需要以下选项之一:

  • Brython(为您提供 Python 脚本标签,在加载时编译为 JS)
  • Skulpt(提供基于 JS 的 Python 解释器)
  • pyodide(在浏览器中运行的基于 WASM 的 Python 解释器)

除此之外,还有一些框架类型的项目,如 DashIDOM,可让您使用 Python 创建浏览器应用程序。

最后,还有 Anvil,它为您提供了使用 Python 开发 Web 应用程序的 VB 风格体验。

鉴于上述所有选项,听起来 Skulpt 可能是您可能想要进一步研究的东西。

1赞 Rohìt Jíndal 11/18/2022 #3

现在可以直接在浏览器中运行 python 代码,而无需除 Web 浏览器以外的任何开发环境。向 PyScript 问好。

根据目前的官方文档

请注意,PyScript 非常 alpha 并且处于低迷状态 发展。从可用性到加载,存在许多已知问题 时代,你应该期待事情经常变化。我们鼓励 人们用 PyScript 玩耍和探索,但目前我们没有 建议将其用于生产。

这是直接在浏览器中打印和使用的演示。Hello Worldlive date timepyscript

<link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
<script defer src="https://pyscript.net/latest/pyscript.js"></script>

<py-script>
  from datetime import datetime
  print('Hello world!')
  now = datetime.now()
  now.strftime("%m/%d/%Y, %H:%M:%S")
</py-script>