Jestem bardzo podekscytowany widząc, że w przeglądarce można teraz kodować Pythona. Oto główni kandydaci (proszę dodać te, które mogłem przeoczyć):
Ale jak wybrać między nimi? Jedyną oczywistą różnicą, jaką widzę, jest to, że Skulpt jest oparty na Pythonie 2, podczas gdy Brython jest oparty na Pythonie 3.
Uwaga: to nie jest prośba o zalecenia lub opinie. Szukam obiektywnych faktów, które pomogłyby w dokonaniu świadomego wyboru.
Odpowiedzi:
Uruchamianie Pythona w przeglądarce to naprawdę dobry i aktualny (stan na 2019 r.) Artykuł, w którym porównano Brython, Skulpt, PyPy.js, Transcrypt, Pyodide, Batavia . Gorąco polecam lekturę.
Dobre podsumowanie można zobaczyć na poniższych zdjęciach.
źródło
Oto kilka informacji na temat Brython vs Transcrypt (lipiec 2016 r., Ponieważ Transcrypt został dodany jako opcja w tym pytaniu przez OP), zebrane przez rozpoczęcie projektu z Brythonem kilka miesięcy temu i przejście do Transcrypt (zakończono przeprowadzkę w zeszłym tygodniu). Lubię Brython i Transcrypt i widzę zastosowania obu z nich.
Dla osób, które są nowicjuszami, Brython i Transcrypt oba „transpile” danych wejściowych Pythona do javascript (Edycja: może lepiej jest postrzegać Brython jako „implementację Pythona dla przeglądarki”, ponieważ nie tworzy ona samodzielnego kodu JavaScript). Oba wymagają składni Python 3. Brython zawiera znaczną liczbę standardowych bibliotek Pythona, a niektóre z nich są własne do radzenia sobie z rzeczami związanymi z siecią, podczas gdy Transcrypt w większości unika tego i sugeruje użycie bibliotek JavaScript.
Brython ( Github) może dokonać konwersji w przeglądarce. Więc piszesz w Pythonie, a silnik brython.js konwertuje go na javascript w locie, gdy strona jest ładowana. Jest to bardzo wygodne i znacznie szybsze niż myślisz. Jednak silnik brython.js, który musisz umieścić na swoich stronach, ma około 500 KB. Jest też kwestia importowania standardowych bibliotek, którą Brython obsługuje, pobierając oddzielne pliki .js z żądaniami XHR. Niektóre biblioteki są już skompilowane w brython.js, więc nie każdy import będzie pobierał nowe pliki, ale jeśli używasz wielu importów, może to działać wolniej. Są jednak sposoby na obejście tego. To, co zrobiłem, to sprawdzić kartę sieciową w narzędziach programistycznych przeglądarki, aby zobaczyć, jakie pliki są pobierane podczas ładowania strony, a następnie usunąć wszystkie pliki, których mój projekt nie używał, z kopii folderu Brython src i uruchom skrypt dołączony do Brythona (wydaje mi się, że znajduje się on pod adresem Brython / www / scripts / make_VFS.py), który kompiluje wszystkie dostępne biblioteki w jeden plik o nazwie py_VFS.js, do którego musisz również połączyć się z html. Zwykle utworzy jeden ogromny plik o wielkości 2 MB +, ale jeśli usuniesz rzeczy, których nie używasz, może być dość mały. Robiąc to w ten sposób, musisz tylko pobrać brython.js, py_VFS.js i swój kod Pythona i nie będą potrzebne żadne dodatkowe żądania XHR.
Z drugiej strony Transcrypt ( Github ) jest dystrybuowany jako pakiet Python 3którego możesz użyć ręcznie lub podłączyć się do swojego łańcucha narzędzi, aby wcześniej skompilować Pythona do javascript. Dzięki Transcrypt piszesz w pythonie, uruchamiasz transkrypt w stosunku do pythona, a on wypluwa javascript, do którego możesz utworzyć link w swoim projekcie. Jest bardziej podobny do tradycyjnego kompilatora, również dlatego, że oferuje pewną kontrolę nad wyjściem. Na przykład, możesz zdecydować się na kompilację do ES6 lub ES5 lub poprosić o wyjście map źródeł (które podczas debugowania niech przeglądarka przeniesie Cię bezpośrednio do odpowiedniego kodu Pythona, zamiast wygenerowanego kodu javascript). Wyjście Transcrypt javascript jest dość zwięzłe ( lub inaczej mówiąc, jest ładny i zwięzły). W moim przypadku 150kB Pythona jest konwertowane na 165kB niezminifikowanego javascript ES5. Dla porównania, wersja mojego projektu Brython zużywała po konwersji około 800Kb.
Jednak uzyskanie korzyści z zwięzłości Transcrypts wymaga nieco przeczytania dokumentacji (naprawdę tylko trochę). Na przykład w przypadku Transcrypt `` prawdziwość '' Pythona dla struktur danych, takich jak dict, set i list, nie jest domyślnie włączona, a włączenie jej na całym świecie jest odradzane z powodu potencjalnych problemów z wydajnością związanych ze sprawdzaniem typów. Dla jasności: w CPythonie pusty dykt, zestaw lub lista ma wartość prawda Fałsz, podczas gdy w Javascript jest to „prawda”. Przykład:
myList = [] if myList: # False in CPython bcs it's empty, true in javascript bcs it exists # do some things.
Istnieją co najmniej trzy sposoby rozwiązania tego problemu:
__pragma__(tconv)
lub__pragma__(notconv)
w swoim kodzie, aby powiedzieć kompilatorowi transkryptowania, aby włączył automatyczną konwersję lokalnie na wartości prawdy podobne do języka Python.Tak, więc mój projekt stawał się coraz większy i chciałem wstępnie skompilować, aby zwiększyć wydajność, ale okazało się to trudne z Brythonem (chociaż jest to technicznie możliwe, najłatwiej jest użyć edytora online i kliknąć przycisk javascript, aby zobaczyć wyjście). Zrobiłem to i utworzyłem link do wygenerowanego kodu javascript z project.html, ale z jakiegoś powodu nie zadziałało. Ponadto trudno mi zrozumieć komunikaty o błędach od Brythona, więc nie wiedziałem, od czego zacząć, gdy ten krok się nie powiódł. Również duży rozmiar wysyłanego kodu i rozmiar silnika brythona zaczęły mnie niepokoić. Postanowiłem więc przyjrzeć się bliżej Transcrypt, który na początku wydawał się być lepszym stopniem, ponieważ wolę odręczne instrukcje, które mówią mi, jak zacząć od razu (te zostały dodane).
Najważniejszą rzeczą podczas konfiguracji po zainstalowaniu Pythona 3.5 było:
activate
bieżący terminal, jeśli nie chcesz za każdym razem wpisywać pełnej ścieżki do nazwy folderu / bin / python3.5. Aktywuj, wpisując: „nazwa folderu źródłowego / bin / aktywuj”__javascript__
. Następnie możesz utworzyć link do wyprowadzonego kodu JavaScript z pliku HTML.Główne kwestie poruszane
Mam raczej proste potrzeby, więc Twój przebieg może się różnić.
Musisz zastąpić standardowe biblioteki brython lub python libs javascript. Na przykład „import json” jest dostarczany przez Brython, ale w Transcrypt możesz użyć biblioteki javascript lub po prostu użyć JSON.parse / JSON.stringify bezpośrednio w kodzie Pythona. Aby dołączyć zminimalizowaną wersję biblioteki javascript bezpośrednio do kodu Pythona, użyj tego formatu (zwróć uwagę na potrójne cudzysłowy):
__pragma__ ('js', '{}', ''' // javascript code ''')
Specyficzne funkcje HTML Brython nie działają oczywiście z Transcrypt. Po prostu użyj normalnych sposobów javascript. Przykłady: 1) w Brython mogłeś odnieść się do określonego tagu HTML używając 'document [' id ']', ale z Transcrypt użyłbyś 'document.getElementById (' id ') (tak samo jak robisz z javascript). 2) Nie możesz usunąć węzła za pomocą „del nodeName” (bcs to funkcja brythona). Użyj czegoś takiego jak „node.parentNode.removeChild (węzeł)”. 3) Zastąp wszystkie funkcje DOM brythona alternatywami javascript. np. nazwa_klasy = nazwa klasy; text = textContent; html = innerHTML; parent = parentNode; children = childNodes itp. Myślę, że jeśli potrzebujesz czegoś, co zawiera alternatywy wymagane przez niektóre starsze przeglądarki, to są do tego biblioteki javascript. 4) Set_timeout Brythona jest zastępowany przez javascripts setTimeout 5) Znaczniki html Brython, takie jak BR (), należy zastąpić zwykłymi sposobami javascript, a także przerobić wszystkie miejsca, w których użyłeś, to składnia manipulacji <= dom. Wprowadź znaczniki zwykłego tekstu jako innerHTML lub utwórz elementy przy użyciu składni javascript, a następnie dołącz je przy użyciu normalnej składni DOM javascript. Zauważyłem również, że dla pól wyboru brython używa "if checkbox = 'zaznaczone':", ale Transcrypt jest zadowolony z "if checkbox:" .. Wprowadź znaczniki zwykłego tekstu jako innerHTML lub utwórz elementy za pomocą składni javascript, a następnie dołącz je za pomocą normalnej składni DOM javascript. Zauważyłem również, że dla pól wyboru brython używa "if checkbox = 'zaznaczone':", ale Transcrypt jest zadowolony z "if checkbox:" .. Wprowadź znaczniki zwykłego tekstu jako innerHTML lub utwórz elementy przy użyciu składni javascript, a następnie dołącz je przy użyciu normalnej składni DOM javascript. Zauważyłem również, że dla pól wyboru brython używa "if checkbox = 'zaznaczone':", ale Transcrypt jest zadowolony z "if checkbox:" ..
Skończyłem przenosić projekt linii 2700 w zeszłym tygodniu, kiedy to Transcrypt nie miał wsparcia dla kilku drobnych rzeczy (chociaż były one dość łatwe do zastąpienia wypełniaczami), były to 1) str. Dolne, str. Podzielone (str. split jest obecny, ale wydaje się, że jest to podział javascript, który działa inaczej niż wersja Pythona, na której działaniu polegałem), 2) round (wydaje się, że jest to obsługiwane w wersji dev) i 3) isinstance didn nie działa na str, int i float, tylko na dict, list i set. 4) Inną różnicą w stosunku do Brythona, którą zauważyłem, jest to, że jeśli pobiorę reprezentację dyktu w formacie JSON, muszę to zrobić za pomocą „myDict = dict (data)”, podczas gdy brython był zadowolony z „myDict = data”. Ale może to być związane z czymś w pliku json.loads Brythona, które zastąpiłem bezpośrednio JSON.parse.
__pragma__('opov')
dla lokalnego), nie możesz wykonywać operacji na zestawach przy użyciu przeciążonego formatu, ale musisz użyć odpowiednich funkcji. Na przykłada = 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) Ponadto nie możesz domyślnie iterować dyktowania za pomocą 'for i in dict:', bez włączania tego (linia cmd -i lub
__pragma__('iconv')
, ale możesz uniknąć konieczności włączania go, używając po prostu keys () member, np:for key, value in dict.items(): # do things for each key and value..
Podsumować
Podoba mi się Brython, ponieważ łatwo jest się nim zająć i przetestować swój kod (tylko F5). Jest bliżej prawdziwego Pythona, ponieważ jest tam większość standardowej biblioteki. Nie podoba mi się konieczność dołączania silnika transpilacji (Edycja: Lub można go postrzegać jako maszynę wirtualną Pythona) w przeglądarce i dużego rozmiaru wyjściowego kodu JavaScript. Gdybym musiał zrobić coś więcej (ale nadal używać Brythona), użyłbym metod javascript do manipulowania DOM z brythona (co możesz zrobić ...), zamiast polegać tak bardzo na metodach Brythona, ponieważ marnowało to czas na przechodzenie na inny transpiler, gdy zmieniły się moje potrzeby.
Lubię Transcrypt, ponieważ wyprowadzony javascript jest naprawdę `` chudy i wredny '' i ponieważ jedyną rzeczą, którą ładujesz po stronie przeglądarki, jest wygenerowany kod javascript, który ma rozmiar podobny do twojego kodu Pythona. Również dlatego, że obsługuje sourcemaps i ponieważ daje mi kontrolę nad wyświetlanym javascriptem. Używanie go nauczyło mnie sporo o optymalizacji.
Mam nadzieję, że pomoże to komuś zobaczyć, które z nich mogą być dobre dla jego konkretnego projektu.
źródło
Używałem i zobowiązałem się do skulpt, a także pypyjs. I wszystkie są bardzo różne, więc jakiekolwiek porównanie jest dyskusyjne, jeśli o mnie chodzi.
To zależy od tego, czego szukasz, co będzie miało największy sens.
PyPyJS
pypyjs to ogromny plik javascript o wielkości 12 MB, który zawiera całą maszynę wirtualną pypy. Więc jeśli chcesz kompletności implementacji Pythona, to jest to twoje dziecko. Ma mostek javascript, który działa naprawdę dobrze, ale nie jest realną opcją do pisania kodu witryny javascript w Pythonie. Pozwoli ci to jednak
import compiler
.Jest zbudowany z emscripten i jest szybszy niż CPython, jeśli chodzi o uruchamianie testu porównawczego pystone.
Dałem krótką rozmowę o pypyjs, tutaj są slajdy.
Skulpt
Jest narzędziem edukacyjnym (lub ewoluowało w to z biegiem czasu), kompiluje twój Python do maszyny stanu bardzo dokładnie emulującej kompilator cpython. W istocie jest to odręczna implementacja kompilatora Pythona w javascript. Pozwala na asynchroniczne wykonywanie, co pozwala na:
while (True): print "hi"
Bez blokowania przeglądarki.
Skulpt jest jedynym, który obsługuje asynchroniczne kontynuacje, pozwala wstrzymać wykonywanie Pythona podczas rozwiązywania asynchronicznych rzeczy. Wykonanie tej pracy:
from time import sleep sleep(1)
Skulpt działa z mniej więcej jedną dziesiątą szybkości CPythona, porównując pystone.
Brython
Wiem o tym najmniej, być może @ olemis-lang może rozszerzyć ten. Ale obok oczywistej różnicy, że Brython to py3, a inne py2. Brython jest także transpilerem.
Brython nie uruchamia testu porównawczego pystone, ponieważ time.clock nie jest zaimplementowany, ponieważ oficjalnie jest to funkcja sprzętowa.
źródło
https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/
Ta strona porównuje trzech kandydatów. Brython wyłania się jako wyraźny zwycięzca.
Pomimo „pomocy” wyjaśniającej, że SO nie nadaje się do tego rodzaju pytań, wydaje się, że w tym przypadku możliwa jest zwięzła odpowiedź.
Może ludzie są zbyt pochopni?
źródło
Przede wszystkim jestem komisarzem Brythona. Niemniej jednak postaram się być jak najbardziej bezstronny, aby móc dokonać obiektywnej oceny.
Kiedy ostatnio go użyłem, Skulpt nie obsługiwał funkcji takich jak wyrażenia generatora. Brython i PyPy.js to robią, więc na poziomie funkcji IMHO późniejsze są lepsze.
Brython (w tej chwili) jest nadal w toku. Niektórych modułów nie można zaimportować (np. Xml.ElementTree ). Niemniej jednak sytuacja ta zaczyna się zmieniać, ponieważ pracujemy nad uruchomieniem całego zestawu testów CPython pomimo osiągnięcia pełnej zgodności ze standardami (przynajmniej jeśli ma to sens).
Brython obsługuje również .vfs.js, aby przyspieszyć import modułów.
PyPy.js ma wiele cech, które wynikają bezpośrednio z faktu, że jest on obsługiwany przez PyPy (kompilacja JIT, dobrze przetestowana, ...), ale nie jestem pewien, czy nadaje się do uruchamiania w przeglądarce. Może się to zmienić wraz z rozwojem projektu.
DO ZROBIENIA: Postaram się uzupełnić moją odpowiedź o wiarygodne testy porównawcze.
źródło
Nie wspomniano tutaj o RapydScript ani RapydScript-NG. Tworzą bardzo wydajny kod JavaScript, który jest używany w GlowScript VPython (glowscript.org). Kiedyś korzystałem z oryginalnego RapydScript Alexa Tsepkova ( https://github.com/atsepkov/RapydScript ), ale ostatnio przeszedłem na RapydScript-NG firmy Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ). Niedawno przeprowadziłem test porównawczy Pystone na CPython, RapydScript i Brython, a wyniki możesz zobaczyć tutaj:
https://groups.google.com/forum/?fromgroups&hl=en#!topic/brython/20hAC9L3ayE
źródło
Ponieważ nikt o tym nie wspomniał, pomyślałem, że warto wspomnieć o Batavii, która implementuje maszynę wirtualną Pythona do uruchamiania prekompilowanego kodu bajtowego Pythona.
Właśnie go wypróbowałem i chociaż jest to interesująca koncepcja, wciąż znajduje się na wczesnym etapie, ponieważ jest mało dokumentacji.
Ostatecznie będzie to zależeć od tego, co próbujesz zrobić. Po obejrzeniu wybrałem Transcrypt , ponieważ był bardziej pragmatyczny i bardziej wydajny, również niedawno wydany / utrzymywany.
źródło
To jest zaktualizowana konferencja, która porównuje wszystkie dostępne obecnie opcje na rynku:
https://www.youtube.com/watch?v=2XSeNQyPlTY
Mówcą jest Russell Keith-Magee, który jest znanym deweloperem w okolicy.
źródło