ブラウザのPython:Brython、PyPy.js、Skulpt、Transcryptから選択する方法は?


89

ブラウザでPythonをコーディングできるようになったことをとてもうれしく思います。これらは主な候補です(私が見落としているかもしれないものを追加してください):

しかし、それらの間でどのように選択するのですか?私が見ることができる唯一の明らかな違いは、SkulptがPython 2に基づいているのに対し、BrythonはPython3に基づいていることです。

注意:これは推奨事項や意見の要求ではありません。私は、知識に基づいた選択に役立つ客観的な事実を探しています。


6
何かに最適なライブラリを推奨するように依頼することは、StackOverflowが適していないことをヘルプが明示的に説明しているケースの1つです。これは素晴らしい質問ですが、このサイトの形式ではありません。おそらく、メーリングリストやフォーラムなど、ディスカッションベースのものが必要です。
abarnert 2015年

2
Transcrypt(transcrypt.org python3.5のINCの大きなサブセットから)コンパイル。多重継承、高速(呼び出しメモ化)、小さくて読みやすいコードを生成し、マルチレベルのソースマップをサポートし、適応なしで任意のJSライブラリを使用できます。免責事項:私はそれを書きました。
Jacques de Hooge 2016年

1
こんにちはfzzylogic、私はタグを追加したので、人々はそれを使用してSOについて質問できるようになりました。JSタグを置き換えました。これは、ブラウザーでPythonを使用したい場合に検索する可能性が最も低いためです。
Jacques de Hooge 2016

1
私は初心者向けのTranscryptの一種のチュートリアルを書きました。github.com/bunkahle/Transcrypt-Examples/blob/master/alerts/…およびgithub.com/bunkahle/Transcrypt-Examples/blob/master/cookies/…
bunkus

1
27の賛成票を持つdstrombergによる削除された回答には、優れた比較リンクがあります:stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html
Cees Timmerman

回答:


26

ブラウザでPythonを実行することは、Brython、Skulpt、PyPy.js、Transcrypt、Pyodide、Bataviaを比較した非常に優れた最新の(2019年現在の)記事です。私はそれを読むことを強くお勧めします。

良い要約は次の写真で見ることができます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください


61

Brython vs Transcrypt(2016年7月、OPによってこの質問のオプションとしてTranscryptが追加されたため)に関する情報を以下に示します。数か月前にBrythonでプロジェクトを開始し、Transcryptに移行しました(先週の移行が完了しました)。私はBrythonとTranscryptが好きで、両方の使用法を見ることができます。

これに不慣れな人のために、BrythonとTranscryptは両方ともjavascriptへのPython入力を「トランスパイル」します(編集:スタンドアロンのjavascriptを生成しないため、Brythonを「ブラウザのPython実装」と見なす方が良いかもしれません)。どちらもPython3構文が必要です。Brythonにはかなりの数のPython標準ライブラリが含まれており、その一部はWeb関連のものを処理するためのものですが、Transcryptはほとんどの場合それを回避し、代わりにJavascriptライブラリを使用することをお勧めします。

BrythonGithub)ブラウザで変換を行うことができます。したがって、Pythonで記述し、brython.jsエンジンは、ページが読み込まれるときにその場でJavaScriptに変換します。これは本当に便利で、想像以上に高速です。ただし、ページに含める必要のあるbrython.jsエンジンは約500Kbです。また、標準ライブラリをインポートするという問題もあります。これは、BrythonがXHRリクエストで個別の.jsファイルをフェッチすることで処理します。一部のライブラリはすでにbrython.jsにコンパイルされているため、すべてのインポートで新しいファイルが読み込まれるわけではありませんが、多くのインポートを使用すると、処理が遅くなる可能性があります。ただし、これを回避する方法があります。私がしたことは、ブラウザ開発ツールの[ネットワーク]タブをチェックして、ページが読み込まれたときにどのファイルが取り込まれていたかを確認し、プロジェクトが使用していなかったすべてのファイルをBrythonsrcフォルダーのコピーから削除することでした。そして、Brythonに含まれているスクリプト(Brython / www / scripts / make_VFS.pyにあると思います)を実行します。このスクリプトは、使用可能なすべてのライブラリをpy_VFS.jsという1つのファイルにコンパイルし、HTMLからリンクする必要があります。通常、2MB以上の巨大なファイルが1つ作成されますが、使用していないものを削除すると、非常に小さい場合があります。このようにすると、brython.js、py_VFS.js、およびpythonコードを取り込むだけで済み、追加のXHRリクエストは必要ありません。

一方、TranscryptGithub)は、Python3パッケージとして配布されます手動で使用するか、ツールチェーンにフックして、事前にpythonをjavascriptにコンパイルできます。したがって、Transcryptを使用すると、Pythonで記述し、Pythonに対してtranscryptを実行すると、プロジェクトでリンクできるjavascriptが出力されます。これは、出力をある程度制御できるという点でも、従来のコンパイラに似ています。たとえば、ES6またはES5にコンパイルするか、ソースマップを出力するように依頼することができます(デバッグ中に、生成されたjavascriptコードの内部にある対応するPythonコードにブラウザで直接移動できます)。Transcryptのjavascript出力はかなり簡潔です(言い換えれば、それはきれいで簡潔です)。私の場合、150kBのPythonは165kBの縮小されていないES5javascriptに変換されます。比較として、私のプロジェクトのBrythonバージョンは、変換後に約800Kbを使用しました。

ただし、Transcryptsの簡潔さの利点を得るには、ドキュメントを少し(実際には少しだけ)読む必要があります。たとえば、Transcryptでは、dict、set、listなどのデータ構造に対するPythonの「真実性」はデフォルトで有効になっておらず、タイプチェックに関連する潜在的なパフォーマンスの問題があるため、グローバルに有効にすることはお勧めしません。明確にするために:CPythonでは、空のdict、セット、またはリストの真理値はFalseですが、Javascriptでは「true」と見なされます。例:

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

これに対処するには、少なくとも3つの方法があります。

  • pythonをjavascriptに変換するときは、-tフラグを使用します。例:$ transcrypt -t python.py(推奨されませんが、パフォーマンスに敏感なコードの内部ループで真実性を何度もチェックしない限り、おそらく問題にはなりません。)
  • 使用__pragma__(tconv)または__pragma__(notconv)あなたのコードの中には、ローカルのpython-のような真理値に自動変換をオンにtranscryptコンパイラを指示します。
  • 真理値をチェックする代わりに、len(myList)> 0をチェックするだけで問題を完全に回避できます...おそらくそれはほとんどの状況で問題ないでしょう、私の軽い使用のための仕事をします。

そうです、私のプロジェクトは大きくなり、パフォーマンスを向上させるためにプリコンパイルしたかったのですが、Brythonではそれを行うのが難しいことがわかりました(技術的には可能ですが、オンラインエディターを使用してjavascriptボタンをクリックして表示するのが簡単な方法です)出力)。私はそれを行い、project.htmlから生成されたjavascriptにリンクしましたが、何らかの理由で機能しませんでした。また、Brythonからのエラーメッセージを理解するのが難しいので、この手順が失敗した後、どこから始めればよいのかわかりませんでした。また、出力されたコードのサイズが大きく、brythonエンジンのサイズが私を悩ませ始めていました。そこで、すぐに始める方法を教えてくれる唖然とした指示を好むので、最初はより高いグレードのように見えたTranscryptを詳しく調べることにしました(これらはその後追加されました)。

Python3.5のインストール後にセットアップする主なものは次のとおりです。

  1. venv(各プロジェクトに使用するスペースが少ないvirtualenvの新しい組み込みバージョンのようなもの)を使用して、python3.5プロジェクトフォルダーを設定します(次のように入力します:python3.5 -m venvfoldername- 3.5のパッケージの問題があるubuntuの回避策)。これにより、特にbinサブフォルダーを持つ「foldername」が作成されます。
  2. Transcrypt pythonパッケージをpip( 'foldername / bin / pip install tr​​anscrypt')でインストールします。これにより、Transcryptpythonパッケージがfoldername / lib / python3.5 / site-packages / transcryptにインストールされます。
  3. activate毎回foldername / bin / python3.5へのフルパスを入力する必要がない場合は、現在のターミナル。次のように入力してアクティブ化します: 'source foldername / bin / activate'
  4. コードの記述を開始し、テストのためにJavaScriptにコンパイルします。コードを記述したフォルダー内からコンパイルします。たとえば、foldername / www / projectを使用しました。したがって、そのフォルダにCDを挿入して、「transcrypt -byour_python_script.py」を実行します。これにより、出力が__javascript__。というサブフォルダーに配置されます。次に、HTMLから出力されたJavaScriptにリンクできます。

移動する主な問題

私のニーズはかなり単純なので、マイレージは異なる場合があります。

  • brythonまたはpythonの標準ライブラリをjavascriptライブラリに置き換える必要があります。たとえば、「import json」はBrythonによって提供されますが、Transcryptでは、javascript libを使用するか、PythonコードでJSON.parse /JSON.stringifyを直接使用できます。縮小版のjavascriptライブラリをPythonコードに直接含めるには、次の形式を使用します(三重引用符に注意してください)。

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
    
  • Brythonのhtml固有の関数は、明らかにTranscryptでは機能しません。通常のjavascriptの方法を使用してください。例:1)Brythonでは、「document ['id']」を使用して特定のHTMLタグを参照した可能性がありますが、Transcryptでは「document.getElementById( 'id')」を使用します(これは同じ方法です)。 javascriptから)。2)「delnodeName」(brython関数であるbcs)のノードを削除することはできません。'node.parentNode.removeChild(node)'のようなものを使用します。3)brythonのすべてのDOM関数をjavascriptの代替関数に置き換えます。例:class_name = className; text = textContent; html = innerHTML; 親= parentNode; children = childNodesなど。古いブラウザで必要な代替手段を含むものが必要な場合は、そのためのjavascriptライブラリがあります。4)Brythonのset_timeoutはjavascripts setTimeoutに置き換えられます。5)BR()などのBrythonのhtmlタグは、通常のjavascriptの方法を使用して置き換え、使用した場所を<= dom操作構文でやり直す必要があります。プレーンテキストのマークアップをinnerHTMLとして挿入するか、javascript構文を使用して要素を作成し、通常のjavascriptDOM構文を使用してそれらをアタッチします。また、チェックボックスに対してbrythonが「ifcheckbox = 'checked':」を使用していることにも気づきましたが、Transcryptは「ifcheckbox:」に満足しています。プレーンテキストのマークアップをinnerHTMLとして挿入するか、javascript構文を使用して要素を作成し、通常のjavascriptDOM構文を使用してそれらをアタッチします。また、チェックボックスに対してbrythonが「ifcheckbox = 'checked':」を使用していることにも気づきましたが、Transcryptは「ifcheckbox:」に満足しています。プレーンテキストのマークアップをinnerHTMLとして挿入するか、javascript構文を使用して要素を作成し、通常のjavascriptDOM構文を使用してそれらをアタッチします。また、チェックボックスに対してbrythonが「ifcheckbox = 'checked':」を使用していることにも気づきましたが、Transcryptは「ifcheckbox:」に満足しています。

  • 私は先週、2700ラインプロジェクトの移動を終了しました。そのとき、Transcryptはいくつかのマイナーなものをサポートしていませんでした(フィラーに置き換えるのは簡単でしたが)、これらは1)str.lower、str.split(str。 splitは存在しますが、javascript splitのようです。これは、Pythonバージョンとは動作が異なり、動作は私が依存していました)、2)round(これは現在devバージョンでサポートされているようです)および3)isinstanceはしませんでしたstr、int、floatでは機能せず、dict、list、setでのみ機能します。4)私が気付いたBrythonとの別の違いは、dictのJSON表現をプルする場合、 'myDict = dict(data)'を使用してプルする必要があるのに対し、brythonは 'myDict = data'に満足していることです。しかし、それは私が直接JSON.parseに置き換えたBrythonのjson.loadsの何かに関連している可能性があります。__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)また、デフォルトで 'for i in dict:'を使用してdictを繰り返すことはできません(cmd line -iまたは__pragma__('iconv')、)。ただし、keys()メンバーを使用するだけで有効にする必要はありません。例:

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

要約すると

  • 私はBrythonが好きです。なぜなら、Brythonを使い始めて、コードをテストするのが簡単だからです(F5だけ)。標準のlibのほとんどがそこにあるので、それは本当のpythonに近いです。トランスパイルエンジン(編集:またはPython VMと見なされる場合があります)をブラウザーに含め、出力されるJavaScriptのサイズが大きいのは嫌です。私が物事をやり直す必要がある場合(ただし、まだBrythonを使用している場合)、JavaScriptメソッドを使用して、brythonメソッドにあまり頼るのではなく、JavaScriptメソッドを使用してBrythonからDOMを操作します(移動するのに時間が無駄になるため)。私のニーズが変わったときに別のトランスパイラーに。

  • 私はTranscryptが好きです。なぜなら、出力されるJavaScriptは実際には「無駄のない平均」であり、ブラウザー側でロードするのは、Pythonコードとサイズが似ている生成されたJavaScriptコードだけだからです。また、ソースマップをサポートし、出力されたJavaScriptを制御する手段を提供するためです。そしてそれを使用することで、最適化についてかなりのことを学びました。

誰かがこれらのどれが彼らの特定のプロジェクトに良いかもしれないかを知るのを助けることを願っています。


1
ブライトンはトランスパイラーだと思いますか?JavaScriptでPythonインタープリターを実装していると確信しています。トランスパイラーの場合は、アプリにバンドルする必要はありません。
カールスミス

@Carl Smith興味深い点ですが、そのように考えていませんでした。BrythonはPythonコードをjavascriptに変換しますが、javascriptには標準のバイトコードがないため、生成されたjavascriptをBrythonエンジンの「バイトコード」と見なすことができます。
fzzylogic 2017

1
あなたは私を誤解しました。BrythonがPythonをJavaScriptに変換することはまったくないと思います。CではなくJSでPythonインタープリターを実装するだけです。GitHubのREADMEによると、「Brython(ブラウザーPython)は、ブラウザーで実行されるPython 3の実装であり、DOM要素とイベントへのインターフェイスを備えています」。
カールスミス

4
@jsbueno現在利用可能なのは、シード、randint、choice、およびrandomです。これらは、出発点としてのみ使用されます。実際、私たちのリストの上位にあったreの場合と同じように、誰かがそれを手に取って完成させることを望んでいます。そんなに難しいことではありません。ライブラリの数は増えていますが、貢献は大歓迎です。JS libを使用することにアクセントが残りますが、個人的にはもっと多くのstandardlibを歓迎します。
Jacques de Hooge 2017年

1
素晴らしい概要。全体として、私が主な違いとして見ているのは(あなたが述べているが強調していない)、Brythonの目標は実際にはブラウザーでPythonを使用できるようにすることですが、Transcryptの目標はPython構文を使用してJavaScriptを記述できるようにすることです。これは、TranscryptがPythonのセマンティクスから基本的なレベルで逸脱する真実の違いのようなことを進んで行うことを意味し、JavaScriptライブラリを活用するコードも対象としているようです。一方、Brythonは、Pythonですべてを実行するという考えで、Pythonを可能な限り忠実に複製しようとします。
BrenBarn 2017

12

私はpypyjsだけでなくskulptも使用し、コミットしました。そして、それらはすべて3つすべて非常に異なっており、私に言わせれば、比較は意味がありません。

それはあなたが探しているものに依存し、どれが最も理にかなっています。

PyPyJS

pypyjsは巨大で、pypy仮想マシン全体を含む12MBのJavaScriptファイルです。したがって、Python実装の完全性が必要な場合、これはあなたの赤ちゃんです。それは本当にうまく機能するjavascriptブリッジを持っていますが、Pythonでjavascriptウェブサイトコードを書くための実行可能なオプションではありません。しかしそれはあなたをさせますimport compiler

これはemscriptenで構築されており、pystoneベンチマークの実行においてCPythonよりも高速です。

pypyjsについて簡単に説明しました。スライドはこちらです。

スカルプト

教育ツールです(または時間の経過とともに進化してきました)。Pythonをステートマシンにコンパイルして、cpythonコンパイラを非常に厳密にエミュレートします。コアとなるのは、JavaScriptでのPythonコンパイラの手書きの実装です。これにより、非同期実行が可能になり、次のことが可能になります。

while (True):
    print "hi"

ブラウザをロックせずに。

Skulptは非同期継続をサポートする唯一のものであり、非同期の発生を解決している間、Pythonの実行を一時停止できます。この作品を作る:

from time import sleep
sleep(1)

pystoneを比較すると、SkulptはCPythonの約10分の1の速度で実行されます。

ブライトン

私はこれについて少なくとも知っています多分@ olemis-langはこれを拡張することができます。しかし、Brythonがpy3であり、他のpy2であるという明らかな違いの次に。ブライトンはトランスパイラーでもあります。

公式にはハードウェア関数であるため、time.clockが実装されていないため、Brythonはpystoneベンチマークを実行しません。


PyPyJS開発者は開発を停止しました。また、Python3のサポートはまだ完了していないようです。github.com/pypyjs/pypyjs/issues/213github.com/pypyjs/pypyjs/issues/172
ローランドPihlakas

それは維持されていませんが、それが機能しないという意味ではありません:) trinket.io/pypyjsしかし、このスペースを見てください。私は何かが最終的に再び泡立つと確信しています。また、自分でやらない限り、オープンソースが維持されることを期待することはできません。:)
albertjan 2018

Python 2を搭載したTrinketはブラウザー側で実行されるのに対し、Python 3(およびnumpy)を搭載したTrinketはサーバー側で実行されるように見えます。コードがサーバー側で実行されているにもかかわらず、ブラウザーで視覚的なプロットをレンダリングできることは、依然として印象的です。彼らがそれをどのように達成したかを知ることは非常に有用でしょう。あなたはなにか考えはありますか?
Roland Pihlakas 2018

Trinketは、RapydScript-NGを使用してPythonをJavaScriptにトランスパイルするGlowScriptライブラリ(glowscript.org)を使用し、WebGLを使用して3Dアニメーションを生成します。トランスパイルと実行はどちらもブラウザで行われます。GlowScriptアーキテクチャの概要は次のとおりです。vpython.org
contents

11

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

このページでは、3つの候補をベンチマークします。ブライトンは明確な勝者として浮上します。

SOはこの種の質問には適していないことを説明する「ヘルプ」にもかかわらず、この場合は簡潔な答えが可能であるように思われます。

多分人々はあまりにも急いでいますか?


5
前回brythonをチェックしたとき、それはpythonの完全な実装ではありませんでした。また、「最良」または「これらから選択する方法」をどのように測定すべきかについても明確ではありません。最速?Pythonはほとんどの場合速度に使用されません。ほとんどの機能/ライブラリを実装していますか?ブラウザでは決して使用しないモジュールがあるかもしれません。一般的な操作(ツリー操作)の余分な(cpythonと互換性のない)構文はプラスまたはマイナスですか?ベンチマークでのパフォーマンスはそれほど意味があるとは思いません。
syntonym 2015年

パフォーマンスベンチマークは、約20〜40%速くなるのではなく、一部の操作で約1000%向上する場合に重要な要素です。Brythonはjavascript上の軽量レイヤーであるため、異なります。また、このプロジェクトは最近Python3に非常に準拠しています。たとえば、大きな整数の処理のために、必要に応じて、いくつかのよく知られた成熟したJavascriptライブラリをプロジェクトに組み込むことです。
jsbueno 2015

7

まず第一に、私はブライトンのコミッターです。それでも、客観的な評価を行うために、できるだけ公平になるように努めます。

前回使用したとき、Skulptはジェネレータ式などの機能をサポートしていませんでした。BrythonとPyPy.jsはそうするので、機能レベルではIMHOの方が優れています。

Brython(現時点)はまだ進行中です。一部のモジュールはインポートできません(例:xml.ElementTree)。それにもかかわらず、標準との完全な互換性を達成しているにもかかわらず(少なくともそれが理にかなっている場合)、CPythonテストスイート全体の実行に向けて取り組んでいるため、この状況は変化し始めています。

Brythonは、モジュールのインポートを高速化するために.vfs.jsもサポートしています。

PyPy.jsには、PyPyを利用しているという事実(JITコンパイル、十分にテスト済みなど)から直接続く多くの特性がありますが、ブラウザーでの実行に適しているかどうかはわかりません。これは、プロジェクトが進展するにつれて変わる可能性があります。

TODO:信頼できるベンチマークで答えを補完しようと思います。


8
skulptのコミッターとして、ジェネレーター式をサポートしていると言えます。:)
albertjan 2015年

6

ここで言及されていないのは、RapydScriptまたはRapydScript-NGです。これらは、GlowScript VPython(glowscript.org)で使用される非常に効率的なJavaScriptコードを生成します。私はアレックスTsepkov(の元RapydScript使用するために使用https://github.com/atsepkov/RapydScript)を最近Kovid Goyal氏のRapydScript-NG(に切り替えhttps://github.com/kovidgoyal/rapydscript-ng)。最近、CPython、RapydScript、およびBrythonでpystoneベンチマークを実行しました。結果は、次のとおりです。

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


結果をまとめていただけますか?
ジェイ

1
6月18日、Pierre Quentelは次のように述べています。「わかりました。パフォーマンスの問題はありますが、状況は改善されています。現在取り組んでいるリリース(3.2.7)では、3.2.6よりも2.5高速でpystoneテストが実行されます。まだ15です。 CPythonよりも数倍遅いですが、初期には数千倍も遅くなりました。」
user1114907 2017

1
rapydscript-ngトランスパイラーを使用してpystonesベンチマークを実行したところ、Windows 10コンピューターでのCPythonの速度の5倍、600000 pystones /秒と125000pystones /秒のベンチマークが行われました。たとえばa + bがa ["+"](b)に変換されるGlowScript VPythonで使用される演算子のオーバーロードをオフにすると、rapydscript-ngのCPython速度の約5倍の係数がCPythonの約7倍に増加します。 ; これは、3Dベクトルを簡単に操作できるようにするために行われます。
user1114907 2017

クエンテルのコメントがブライトンに言及しているとは言いませんでした。
user1114907 2017

2
これ以上ベンチマークを実行していません。RapydScriptの開発が停滞したとき、私は最初にRapydScript-NGに切り替えました。その後、Alex Tsepkovが開発に戻ったとき、私は彼と交換しました。彼でさえ、KovidGoyalのNGプロジェクトがglowscript.orgでの私の特定の使用により適していることに同意しました。TsepkovはWebプログラマー向けにPython / JavaScriptの混合言語を構築したいと考えていますが、Goyalは標準のPythonに近いことを強調し、ブラウザーでのコンパイルを適切にサポートしています。どちらも私の仕事の鍵です。
user1114907 2017

4

誰も言及していないので、プリコンパイルされたPythonバイトコードを実行するためのPython仮想マシンを実装するBataviaについて言及する価値があると思いました。

試してみましたが、面白いコンセプトですが、ドキュメントが少ないのでまだ初期段階です。

結局、それはあなたが何をしようとしているかに依存します。Transcryptはより実用的でパフォーマンスが高く、最近リリース/保守されたため、見てからTranscryptを選択しました。


Skulptはまだ積極的に維持されており、かなり大規模なユーザーベース(couseraのいくつかの非常に極性の高いコース)によって使用されていますが、transcryptほどリリースされない可能性がありますが、その上に製品を構築したメンテナ、メンテナはもっとたくさんいます。ですから、彼らは長期的にはその中にいます。:)
albertjan 2017年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.