ブラウザでPythonをコーディングできるようになったことをとてもうれしく思います。これらは主な候補です(私が見落としているかもしれないものを追加してください):
しかし、それらの間でどのように選択するのですか?私が見ることができる唯一の明らかな違いは、SkulptがPython 2に基づいているのに対し、BrythonはPython3に基づいていることです。
注意:これは推奨事項や意見の要求ではありません。私は、知識に基づいた選択に役立つ客観的な事実を探しています。
ブラウザでPythonをコーディングできるようになったことをとてもうれしく思います。これらは主な候補です(私が見落としているかもしれないものを追加してください):
しかし、それらの間でどのように選択するのですか?私が見ることができる唯一の明らかな違いは、SkulptがPython 2に基づいているのに対し、BrythonはPython3に基づいていることです。
注意:これは推奨事項や意見の要求ではありません。私は、知識に基づいた選択に役立つ客観的な事実を探しています。
回答:
ブラウザでPythonを実行することは、Brython、Skulpt、PyPy.js、Transcrypt、Pyodide、Bataviaを比較した非常に優れた最新の(2019年現在の)記事です。私はそれを読むことを強くお勧めします。
良い要約は次の写真で見ることができます。
Brython vs Transcrypt(2016年7月、OPによってこの質問のオプションとしてTranscryptが追加されたため)に関する情報を以下に示します。数か月前にBrythonでプロジェクトを開始し、Transcryptに移行しました(先週の移行が完了しました)。私はBrythonとTranscryptが好きで、両方の使用法を見ることができます。
これに不慣れな人のために、BrythonとTranscryptは両方ともjavascriptへのPython入力を「トランスパイル」します(編集:スタンドアロンのjavascriptを生成しないため、Brythonを「ブラウザのPython実装」と見なす方が良いかもしれません)。どちらもPython3構文が必要です。Brythonにはかなりの数のPython標準ライブラリが含まれており、その一部はWeb関連のものを処理するためのものですが、Transcryptはほとんどの場合それを回避し、代わりにJavascriptライブラリを使用することをお勧めします。
Brython(Github)ブラウザで変換を行うことができます。したがって、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リクエストは必要ありません。
一方、Transcrypt(Github)は、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つの方法があります。
__pragma__(tconv)
または__pragma__(notconv)
あなたのコードの中には、ローカルのpython-のような真理値に自動変換をオンにtranscryptコンパイラを指示します。そうです、私のプロジェクトは大きくなり、パフォーマンスを向上させるためにプリコンパイルしたかったのですが、Brythonではそれを行うのが難しいことがわかりました(技術的には可能ですが、オンラインエディターを使用してjavascriptボタンをクリックして表示するのが簡単な方法です)出力)。私はそれを行い、project.htmlから生成されたjavascriptにリンクしましたが、何らかの理由で機能しませんでした。また、Brythonからのエラーメッセージを理解するのが難しいので、この手順が失敗した後、どこから始めればよいのかわかりませんでした。また、出力されたコードのサイズが大きく、brythonエンジンのサイズが私を悩ませ始めていました。そこで、すぐに始める方法を教えてくれる唖然とした指示を好むので、最初はより高いグレードのように見えたTranscryptを詳しく調べることにしました(これらはその後追加されました)。
Python3.5のインストール後にセットアップする主なものは次のとおりです。
activate
毎回foldername / bin / python3.5へのフルパスを入力する必要がない場合は、現在のターミナル。次のように入力してアクティブ化します: 'source foldername / bin / activate'__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を制御する手段を提供するためです。そしてそれを使用することで、最適化についてかなりのことを学びました。
誰かがこれらのどれが彼らの特定のプロジェクトに良いかもしれないかを知るのを助けることを願っています。
私はpypyjsだけでなくskulptも使用し、コミットしました。そして、それらはすべて3つすべて非常に異なっており、私に言わせれば、比較は意味がありません。
それはあなたが探しているものに依存し、どれが最も理にかなっています。
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ベンチマークを実行しません。
このページでは、3つの候補をベンチマークします。ブライトンは明確な勝者として浮上します。
SOはこの種の質問には適していないことを説明する「ヘルプ」にもかかわらず、この場合は簡潔な答えが可能であるように思われます。
多分人々はあまりにも急いでいますか?
まず第一に、私はブライトンのコミッターです。それでも、客観的な評価を行うために、できるだけ公平になるように努めます。
前回使用したとき、Skulptはジェネレータ式などの機能をサポートしていませんでした。BrythonとPyPy.jsはそうするので、機能レベルではIMHOの方が優れています。
Brython(現時点)はまだ進行中です。一部のモジュールはインポートできません(例:xml.ElementTree)。それにもかかわらず、標準との完全な互換性を達成しているにもかかわらず(少なくともそれが理にかなっている場合)、CPythonテストスイート全体の実行に向けて取り組んでいるため、この状況は変化し始めています。
Brythonは、モジュールのインポートを高速化するために.vfs.jsもサポートしています。
PyPy.jsには、PyPyを利用しているという事実(JITコンパイル、十分にテスト済みなど)から直接続く多くの特性がありますが、ブラウザーでの実行に適しているかどうかはわかりません。これは、プロジェクトが進展するにつれて変わる可能性があります。
TODO:信頼できるベンチマークで答えを補完しようと思います。
ここで言及されていないのは、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
誰も言及していないので、プリコンパイルされたPythonバイトコードを実行するためのPython仮想マシンを実装するBataviaについて言及する価値があると思いました。
試してみましたが、面白いコンセプトですが、ドキュメントが少ないのでまだ初期段階です。
結局、それはあなたが何をしようとしているかに依存します。Transcryptはより実用的でパフォーマンスが高く、最近リリース/保守されたため、見てからTranscryptを選択しました。
これは、現在市場で利用可能なすべてのオプションを比較する更新された会議です。
https://www.youtube.com/watch?v=2XSeNQyPlTY
スピーカーは、この地域で有名な開発者であるRussellKeith-Mageeです。