蟒蛇在浏览器:如何Brython,PyPy.js,Skulpt和Transcrypt之间进行选择?蟒

2019-05-13 05:27发布

我很高兴地看到,它现在可以在浏览器中编写Python的。 这些是主要的候选人(请加任何我可能忽略了):

  • 英国人
  • Skulpt
  • PyPy.js
  • Transcrypt

但是,如何在它们之间进行选择呢? 唯一明显的区别,我可以看到的是,Skulpt是基于Python 2中,而Brython是基于Python的3。

请注意: 这不是建议或意见的请求。 我在寻找客观事实,将告知一个受过教育的选择。

Answer 1:

这里有Brython VS Transcrypt一些信息(七月2016年,因为Transcrypt是由OP在这个问题上的选项添加),通过几个月前开始了与Brython项目,并移动到Transcrypt(完成上周移动)收集。 我喜欢Brython和Transcrypt,可以看到使用了他们两个。

对于人是新来这个,Brython和Transcrypt既有“transpile”蟒蛇输入的JavaScript(编辑:也许这是更好地查看Brython为“为浏览器Python实现”,因为它不会产生独立的JavaScript)。 这都需要Python 3的语法。 Brython包括Python标准库和一些它自己的用于处理网页相关的事情的相当数量,而Transcrypt避免了大部分,并建议使用JavaScript库来代替。

Brython ( Github上 )能做到在浏览器的转换。 所以,你在Python编写,并加载页面时的brython.js引擎将其转换为JavaScript的飞行。 这是真的很方便,而且比你想象的要快得多。 但是,您需要在您的网页包含brython.js引擎约为500KB。 此外,还有进口标准库的事,这Brython处理通过获取与XHR请求单独的.js文件。 一些库已经编译成brython.js,因此不是每个进口将在新的文件拉,但如果你使用的进口商品,情况可能会变得缓慢。 不过,也有解决这个方法。 我所做的就是要检查浏览器开发工具的网络标签来查看已被拉在加载页面时,然后删除我的项目没有在Brython src文件夹的副本使用的所有文件哪些文件,并运行附带Brython脚本(我认为这是在Brython / WWW /脚本/ make_VFS.py),编译所有可用的库到一个文件名为py_VFS.js,你还需要从你的HTML链接到的。 通常情况下,就会使一个巨大的2MB +文件,但如果删除不使用的东西,它可以是相当微小的。 这样做,这样,意味着你只需要在brython.js拉,将需要py_VFS.js和Python代码,并没有额外XHR请求。

Transcrypt ( Github上 ,另一方面),分布为蟒蛇3包 ,您可以手动使用,或挂接到你的工具链,编译蟒蛇到JavaScript的提前。 因此,与Transcrypt,你在Python编写,运行transcrypt对Python和它吐出的JavaScript,你可以在你的项目链接。 它更像是一个传统的编译器还在于它提供了一个在输出一些控制。 例如,你可以选择编译到ES6或ES5,或者要求它输出sourcemaps(即调试咱就浏览器可直接到相应的Python代码时,INSEAD生成的JavaScript代码。)Transcrypt的JavaScript输出是非常简洁(或者换一种说法,它的漂亮,简洁)。 在我的情况蟒150KB转化为unminified ES5的JavaScript 165KB。 相比较而言,我的项目的Brython版本转换后使用约800KB。

然而,越来越Transcrypts简洁的好处,需要阅读的文档位(实际上只是一个位)。 例如,对于Transcrypt,Python的“感实性”像字典,集和列表数据结构不被默认启用,并在全球范围启用它,是因为涉及到类型检查潜在的性能问题气馁。 为了清晰:在CPython的,空的字典,设置或列表中有真值假,而在Javascript中它被认为是“真”。例:

myList = []
if myList:    # False in CPython bcs it's empty, true in javascript bcs it exists
    # do some things.

至少有三种方式来解决这个问题:

  • 转换时蟒蛇的JavaScript例如使用-t标志:$ transcrypt -t python.py(不推荐,但可能不是,除非你在性能敏感的代码的内循环检查感实性多次的一个问题。)
  • 使用__pragma__(tconv)__pragma__(notconv)你的代码中告诉transcrypt编译器自动转换本地切换到蟒蛇般的真值。
  • 不是检查的真值,完全避免问题的只是检查LEN(myList中)> 0 ...也许这将是适用于大多数情况下,做这项工作对我的光使用。

对,所以我的项目是越来越大,我想预编译的性能增益,但发现很难与Brython这样做(尽管它在技术上是可行的,一个简单的方法是使用在线编辑器 ,然后单击JavaScript的按钮来查看输出)。 我这样做,并链接到从project.html生成的JavaScript,但它并没有出于某种原因。 另外,我觉得很难理解从Brython错误信息,所以我不知道从哪里开始后,这一步失败了。 此外,输出码的大尺寸和brython发动机的尺寸开始来烦我。 所以,我决定在Transcrypt仔细一看,其中有起初似乎是档次较高的,因为我喜欢简单化了,告诉我如何立即开始(这些,至今已加)指令。

最主要的得到它设置安装Python3.5是后:

  1. 使用VENV(它就像virtualenv中的使用更少的空间为每个项目一个新的内置版本)建立python3.5项目文件夹(只需键入:python3.5 -m VENV FOLDERNAME - 解决方法有3.5包问题的ubuntu )。 这使得“文件夹名”与除其他事物的bin子文件夹。
  2. 与PIP安装Transcrypt Python包( '文件夹名/斌/ PIP安装transcrypt'),它安装它FOLDERNAME / lib中/ python3.5 /站点包/ transcrypt。
  3. activate当前的终端,如果你不希望有输入完整的路径,文件夹名,每次/斌/ python3.5。 “源文件夹名称/斌/激活”:通过输入激活
  4. 开始写代码,并将其编译成JavaScript的测试。 从你写在你的代码的文件夹内编译。例如,我使用的文件夹名称/网络/项目。 所以CD到该文件夹​​,然后运行:“transcrypt -b your_python_script.py”。 这使输出在一个叫子__javascript__ 。 然后,您可以链接到您的HTML输出的JavaScript。

主要问题横跨移动

我有相当简单的需求,让您的里程可能会有所不同。

  • 您需要使用JavaScript库,以取代brython或Python标准库。 因此,例如,“进口JSON”被Brython提供,但Transcrypt下,你可以使用JavaScript lib或只是在你的Python代码中使用JSON.parse / JSON.stringify直接。 直接在您的Python代码使用包括JavaScript库的缩小版本的格式(注意三重引号):

     __pragma__ ('js', '{}', ''' // javascript code ''') 
  • Brython的HTML特定的功能不Transcrypt明显的工作。 只需使用普通的JavaScript方法。 例子:1)Brython下,你可能会提到使用“文件[”身份证“]”特定HTML标签,但Transcrypt你会使用“的document.getElementById(”身份证')(这是你做同样的方式它从JavaScript)。 2)不能删除一个节点“德尔节点名称”(BCS这是一个brython功能)。 使用类似“node.parentNode.removeChild(节点)”。 3)使用JavaScript的替代品代替所有的brython的DOM功能。 例如CLASS_NAME =的className; 文本=的textContent; HTML = innerHTML的; 父= parentNode; 孩子=的childNodes等。我想,如果你需要的东西,包括一些旧的浏览器需要替代再就是对于JavaScript库。 4)Brython的set_timeout被替换的JavaScript的setTimeout 5)Brython的HTML标签,如BR()需要使用正常的JavaScript的方式,以及重做你使用它的<= DOM操作语法的任何地方进行更换。 无论是注入纯文本标记为innerHTML的也不能使用JavaScript语法元素,然后用普通的JavaScript DOM语法重视他们。 我还注意到,对于复选框brython使用“如果复选框=‘检查’:”但Transcrypt很满意:“如果复选框:” ..

  • 我完成移动比上周此时Transcrypt没有几小事情支持2700线项目(虽然他们很容易与填料更换),这些都是1)str.lower,str.split(海峡。拆分是存在的,但似乎是JavaScript的分裂,其作品不同的Python版本,其中我是依靠行为),2)圆(这似乎在开发版本现在可以支持)和3)isinstance没“T对海峡,int和float的工作,只有字典,列表和设置。 4)从Brython我注意到另一个区别是,如果我在一个字典的JSON表示拉,我需要做这样使用“myDict =字典(数据)”,而brython很高兴与“myDict =数据”。 但是,这可能与在Brython的json.loads,我直接用JSON.parse替代的东西。 5)不还专门启用Transcrypts操作符重载(使用全球-o开关,或者__pragma__('opov')为本地),你不能这样做使用重载格式,比如集合操作的东西,但需要使用相应的功能。 例如

     a = set([1, 2, 3]) b = set([3, 4, 5]) a.difference(b) # is used instead of a - b a.union(b) # used instead of a | b a.intersection(b) # used instead of a & b a.symmetric_difference(b) # used instead of a ^ b 

6)另外,还可以通过不使用缺省迭代类型的字典“对于i在字典:”,而无需启用该(CMD线-I或__pragma__('iconv')但可以避免仅通过使用键来启用它()成员例如:

for key, value in dict.items():
    # do things for each key and value..

总结

  • 我喜欢Brython因为它很容易得到它去和测试代码(只是F5)。 它更接近真正的蟒蛇,因为大部分的标准库中是存在的。 我不喜欢不必包括transpilation引擎(编辑:或者,人们可能会认为这是一个Python VM)在浏览器和JavaScript的大小输出的大。 如果我不得不做的事情了(但仍使用Brython),我会用JavaScript的方法来操作从brython的DOM(你可以做..),而不是靠在这么多的brython方法,因为浪费的时间跨越动另一个transpiler当我需要改变。

  • 我喜欢Transcrypt因为输出JavaScript是真正的“精益和平均”因为你加载浏览器端的唯一的事情就是你生成的JavaScript代码是在大小Python代码相似。 此外,因为它支持sourcemaps因为它给了我在输出的JavaScript控制措施。 并用它教会了我很多有关优化。

希望可以帮助别人看到其中的这些可能是很好的为他们的具体项目。



Answer 2:

我已经使用并承诺skulpt以及pypyjs。 他们都是三个非常不同,任何比较是毫无意义,如果你问我。

这取决于你在找什么,这将使最有意义。

PyPyJS

pypyjs是巨大的它的JavaScript文件,其中包含整个pypy虚拟机12MB。 所以,如果你想Python实现的完整性,这是你的宝宝。 它有一个JavaScript桥的作品真的很好,但它不是在Python写你的JavaScript代码的网站一个可行的选择。 然而,它可以让你import compiler

它的建成与emscripten和更快然后CPython的,在运行pystone基准。

我做了简短的谈pypyjs 这里是幻灯片。

Skulpt

是一个教学工具(或者它已经演变成一段时间内),它编译你的Python成一个状态机非常密切仿效CPython的编译器。 在它的核心是手写执行JavaScript中的蟒蛇编译器。 它允许异步执行,它可以让你这样做:

while (True):
    print "hi"

如果没有锁定了浏览器。

Skulpt是支持异步执行的只有一个,它可以让你暂停蟒蛇的执行,而它的解决一些异步的事情发生。 使这项工作:

from time import sleep
sleep(1)

Skulpt运行在CPython的速度的十分之一,比较pystone时。

英国人

我至少知道这一个也许@ olemis琅可以扩大这一个。 但旁边的明显区别在于Brython是PY 3,其他PY2。 Brython也是transpiler。

Brython不运行pystone基准,因为time.clock没有实现,因为正式它是一个硬件功能。



Answer 3:

https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/

这页基准测试的三位候选人。 Brython出现以明显优势胜出。

尽管“帮助”解释说,因此不适合这样的问题,看来,一个简洁的回答是在这种情况下可能。

也许人们正在过于草率?



Answer 4:

首先,我是一个Brython提交者。 不过我会尽力尽可能公正做一个客观评价的缘故。

我用它Skulpt上次不支持像发电机表情功能。 Brython和PyPy.js这样做,所以在功能层面恕我直言以后都更胜一筹。

Brython(此时)的工作仍然在进行中。 一些模块可以不被导入(例如xml.ElementTree )。 不过这一状况正在开始改变,因为我们正在努力,尽管实现与标准完全兼容的运行整个CPython的测试套件工作(至少当它是有道理的)。

Brython还支持.vfs.js加快模块导入。

PyPy.js都有一个编号,遵循简单的从它的实际上是由PyPy上电(JIT编译,行之有效的,...),但我不知道它是否适合在浏览器中运行的特点。 随着项目的发展,这可能改变。

TODO:我会尽力提供可靠的基准来弥补我的答案。



Answer 5:

这里没有提到的是RapydScript或RapydScript-NG。 它们产生非常高效的JavaScript代码,这是在GlowScript VPython(glowscript.org)使用。 我以前用的亚历克斯Tsepkov(原RapydScript https://github.com/atsepkov/RapydScript ),但最近切换到Kovid戈亚尔的RapydScript-NG( https://github.com/kovidgoyal/rapydscript-ng )。 我最近跑了CPython的,RapydScript和Brython的pystone基准,你可以在这里看到的结果:

https://groups.google.com/forum/?fromgroups&hl=en#!topic/brython/20hAC9L3ayE



Answer 6:

由于没有人提到它,我认为这是值得的,更何况巴达维亚它实现了Python的虚拟机运行预编译的Python字节码。

我只是想它,而这是一个有趣的概念,但它仍然处于早期阶段,因为它们很少文档。

最终这将取决于你正在尝试做的。 我选择Transcrypt在看看,因为它是更务实,更高性能,也更加最近发布/维护后。



Answer 7:

这是一个更新的会议,其现在比较市场上所有可用的选项:

https://www.youtube.com/watch?v=2XSeNQyPlTY

说话的人是罗素基思 - 马吉,谁是该地区一个知名开发商。



文章来源: Python in Browser: How to choose between Brython, PyPy.js, Skulpt and Transcrypt?