一直以来,网页浏览器编程所用的编程语言主力就是JavaScript,浏览器就是一个JavaScript的原生解释器。

那么Python能不能直接运行在浏览器上呢,或者说Python能不能作为浏览器开发的编程语言?

本文对这一问题做了详细的调研,结果可以用一句话总结:可以,但很鸡肋。

可用方案

调研过程中,发现了很多有趣的解决方案,总结起来可以有两类:

(1)将Python语言编译成JavaScript

即将现成的Python语言翻译成JavaScript,然后在浏览器网页中运行,比如:

Brython

Skulpt

Transcrypt

(2)在浏览器中内置Python解释器

即将Python解释器放在浏览器中,这样就能直接运行Python代码,比如:

Pyodide

PyPy.js

我觉得这两类各自的重点不一样:

第一种是为了用Python来代替JavaScript,即用Python操作网页DOM(Document Object Model)元素,让不熟悉JS的编程人员也能用Python来做一个简单的动态交互网页;

第二种,比如Pyodide,它的野心很大,即将Python的科学计算生态搬到浏览器中,比如numpy、scipy、matplotlib等科学计算常用的函数库直接放进浏览器中,而不是常见的比如作为浏览器服务器后端来调用。这样实现的效果就是不需要部署服务器,直接在浏览器中做复杂的函数计算,并反映到网页上。

下面详细介绍一下两类实现中的代表:Brython和Pyodide。

Brython

先看一下用Brython写的Hello World:

<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Hello world demo written in Brython www.brython.info">
<meta name="keywords" content="Python,Brython">
<meta charset="iso-8859-1">
<title>Hello world</title>
<script type="text/javascript" src="/src/brython.js"></script>
<script type="text/python" src="show_source.py"></script>
</head>// ------------注意看这一块-------------
<body onload="brython(1)"><script type="text/python">
from browser import document, alert
from browser.widgets.dialog import InfoDialogdef echo(ev):InfoDialog("Hello", f"Hello {document['zone'].value} !")document["test"].bind("click", echo)
</script>
// ------------注意看结束-------------<p>Your name is : <input id="zone" autocomplete="off">
<button id="test">click !</button>
</body></html>

从上面片段很显而易见,Brython就是用Python来替代JavaScript的写法,比如获取网页上的元素并改变其值。

如果想快速开发一个动态网页,同时不懂JavaScript,可以使用Brython来写。

但注意Brython没法使用Python的整个生态,只能使用部分标准库,比如sys。

Pyodide

简言之,Pyodide就是在浏览器中运行Python,且能调用Python的数值计算库。

Pyodide解决的痛点是无法在浏览器中进行科学计算:

(1)一方面,现在越来越多的软件都Web化、浏览器化。而浏览器的通用编程语言是JavaScript,但其没有成熟的数据科学处理库,也缺乏一些数值计算很有用的功能和数据结构。

(2)另一方面,Python具有成熟且活跃的科学计算生态,比如基本上所有函数库都依赖的numpy数据结构,但其无法在浏览器运行。

Pyodide 项目则是通过将现有的 CPython 解释器编译为 WebAssembly 并在浏览器的 JavaScript 环境中运行这个编译出来的二进制文件,这提供了一种在浏览器中运行 Python 的方法。

Pyodide有一些非常炫的功能点:

在Python和JavaScript之间进行交互

如果所有Pyodide能做的就只是运行Python代码并写出到标准输出上,它将会增长成为一个不错的很酷的技巧,但是不会成为一个用于实际工作的实用工具。真正的力量源于它与浏览器API以及其它运行在浏览器中的JavaScript库交互的能力。由于我们已经将Python解释器编译为了WebAssembly,它也与JavaScript端具有深度的交互。

Pyodide会在许多Python与JavaScript之间的内建数据类型之间进行隐式转换。其中一些转换时很直接明显的,但如往常一样,那就是很有趣的极端情况。

访问Web API和DOM

可以通过以下方式获得Web页面上的文档对象模型DOM:

from js import document

这会将document对象作为一个代理从JavaScript端导入到Python端。你可以开始从Python中对其调用方法:

document.getElementById("myElement")

多维数组

在Python中, NumPy 数组是最常用的多维数组的实现。JavaScript具有TypedArrays,其仅含有一个单一的数值类型,但是是一维的,因此需要在其之上构建多维索引。

由于实际上这些数组可能会非常大,我们不想在语言运行时间拷贝它们。那不仅仅会花相当长的时间,而且在内存中同时保留两个拷贝将会加重浏览器所具有的被限制的内存的负担。

幸运的是,我们可以不用拷贝来共享数据。多维数组通常是用少量用于描述值类型和数组形状及内存分布的元数据来实现的。数据本身是从元数据中通过指针访问的另一个内存区域。该内存处于一个叫作“WebAssembly堆”的区域,这带来一个优势,因为其可以从JavaScript和Python中同时访问。我们可以简单地在语言之间拷贝元数据(其本身非常小),并保持指针指向WebAssembly堆中的数据。

实时交互可视化

在浏览器中进行数据科学计算相比于如Jupyter一样在远程内核中进行计算的一大优势就是,交互式可视化不用通过网络来传输数据并重新处理和展示这些数据。这很大程度地减少了延迟—用户移动鼠标的时刻与屏幕更新并显示图案的时刻之间的间隔时间。

要使得其能工作需要上面描述到的所有的技术片段能够很好地协同工作。我们使用matplotlib来看一下用于展示正态分布如何工作的交互性示例。首先,通过Python的Numpy产生随机数据。接下来,Matplotlib接管该数据,并使用内建的软件渲染器来将其绘出。它使用Pyodide对零拷贝共享数组的支持来将像素回馈给JavaScript端,在这里数据最终被渲染为HTML的画布。然后浏览器接管工作,将像素显示到屏幕上。用来支持交互性操作的鼠标和键盘事件通过从Web浏览器到Python的回调函数的调用来处理。

但需要注意的是Pyodide有两个缺点:

(1)包体积巨大,在浏览器中第一次访问内含Pyodide的网页时,会下载相应的python包,最基础的pyodide也有22MB大小,更不用说如果有额外的包,比如matplotlib,会更加巨大,导致长时间加载不出来页面;

(2)对于Python日渐火热的深度学习生态,Pyodide也没法直接利用,毕竟那些函数库会更大。

Python爱浏览器,但浏览器不爱它:如何让Python运行在浏览器上相关推荐

  1. python利用自动识别写模块_教你用Python 实现自动导入缺失的库

    在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx' 或者 ModuleNotFoundError: No mod ...

  2. Python爬虫 —— urllib库的使用(get/post请求+模拟超时/浏览器)

    Python爬虫 -- urllib库的使用(get/post请求+模拟超时/浏览器) 这里写目录标题 Python爬虫 -- urllib库的使用(get/post请求+模拟超时/浏览器) 1.Py ...

  3. java 浏览器测试,【Java资源大全】Selenium:基于浏览器的测试套件

    (点击上方公号,可快速关注) 来源:http://hao.jobbole.com/ 作者:伯乐在线-唐尤华 Selenium是用于在多个平台上自动化操作浏览器的工具套件,支持多种浏览器.多种操作系统. ...

  4. 自动答题 之 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

    前几天接到的小单子,某些人员为了应付单位的硬性要求,每天必须在网上学习多少道题,每天必须在网上练习多少道题,所以想找人开发一个自动答题系统.上图为<某练兵比武在线学习>的自动答题演示. 怀 ...

  5. qq打开网页时提示用浏览器打开html,微信QQ打开网页时提示用浏览器打开

    微信QQ打开网页时提示用浏览器打开 一,需求分析 1.1,使用微信或QQ打开网址时,无法在微信或QQ内打开常用下载软件,手机APP等.故此需要在微信qq里提示 二,功能实现 2.1 html实现 请点 ...

  6. c++浏览器自动化操作_精:C# 利用Selenium实现浏览器自动化操作

    概述 Selenium是一款免费的分布式的自动化测试工具,支持多种开发语言,无论是C. java.ruby.python.或是C# ,你都可以通过selenium完成自动化测试.本文以一个简单的小例子 ...

  7. 运行在浏览器中的深度学习框架,开源了

    百度近期开源了国内首个以JavaScript实现的Web端推理引擎 Paddle.js.Paddle.js用于帮助前端工程师更加简单地将智能化因素引入网页中,让Web前端可以实现更多的能力. 通过浏览 ...

  8. atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o...

    atitit. 浏览器插件 控件   applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o 1. 服务器部署签名 1 2. 签名流程::生成密钥..导出cert正书,签名 1 3. ...

  9. Crawler:反爬虫机制之基于urllib库+伪装浏览器+代理访问(代理地址随机选取)+实现下载某网址上所有的图片到指定文件夹

    Crawler:反爬虫机制之基于urllib库+伪装浏览器+代理访问(代理地址随机选取)+实现下载某网址上所有的图片到指定文件夹 导读 基于反爬虫机制之基于urllib库+伪装浏览器+代理访问(代理地 ...

最新文章

  1. python数据挖掘试题四十道,你敢来挑战吗?
  2. 【Win32汇编】数组求和函数
  3. Android开发五 Android应用程序架构
  4. Cocoa Touch国际化
  5. ExtJs常用数据源store
  6. java学习(150):文本缓冲流
  7. Iptalbes自动封杀暴力破解(Qmail邮件系统)者的IP地址
  8. mysql统计每周每个学校新增学生数量_深入学习之mysql(四)聚合函数
  9. JAVA中ByteArrayInputStream和ByteArrayOutputStream详解
  10. java 快速删除文件夹_如何用Java删除文件夹里的所有文件?
  11. 兄弟连mysql数据库_兄弟连学python-------MySQL数据库基础知识
  12. 如何关闭139端口及445端口等危险端口
  13. python生成器_Python生成器
  14. oracle取字段第三位字符,oracle截取字符串(截取某个字符前面的字符串)
  15. java使用mysql的escape遇到的坑
  16. 97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作
  17. wordpress专属线报网主题模板
  18. 【论文泛读08】基于深度时空残差网络的城市人群流动预测
  19. 【IC7】FPGA最高工作频率的计算方法;FPGA最大输出频率;查看handbook的PLL最高频率;Fout_ext;Fout两个参数;FPGA输出1ns脉冲
  20. oracle左连接查询去重,左连接去重(objec)

热门文章

  1. win10共享文件夹无法访问问题
  2. canvas像素操作、save与restore、合成与变形
  3. java菜鸟快速上手指南
  4. java 翻译 go语言_【翻译】go是面向对象语言吗?
  5. 40G SR4 vs 40G BIDI vs 40G UNIV:你选哪个?
  6. a += a-= a*a
  7. 小米3联通电信版解锁(2013062 2013063)刷机包可解账号锁
  8. 启辰r30近光灯远光灯保险盒,近光灯故障处理
  9. xshell突然连接不上
  10. python入门第三课(初中生学Python)