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:
Istnieją co najmniej trzy sposoby rozwiązania tego problemu:
- Użyj flagi -t podczas konwersji Pythona do javascript, np .: $ transcrypt -t python.py (niezalecane, ale prawdopodobnie nie stanowi problemu, chyba że wielokrotnie sprawdzasz prawdziwość w wewnętrznych pętlach kodu wrażliwego na wydajność ..)
- Użyj
__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.
- Zamiast sprawdzać wartość prawdy, całkowicie uniknij problemu, po prostu sprawdzając len (myList)> 0 ... Może to będzie w porządku w większości sytuacji, wystarczy na moje lekkie użycie.
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:
- Użyj venv (to jak nowa wbudowana wersja virtualenv, która zajmuje mniej miejsca dla każdego projektu), aby skonfigurować folder projektu python3.5 (wystarczy wpisać: python3.5 -m venv nazwa folderu - obejście dla ubuntu z problemami z pakietami dla wersji 3.5 ). To sprawia, że „nazwa folderu” jest między innymi podfolderem bin.
- Zainstaluj pakiet Transcrypt python za pomocą pip (`` nazwa folderu / bin / pip install transcrypt ''), który instaluje go w folderze / lib / python3.5 / site-packages / transcrypt.
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”
- Zacznij pisać kod i kompilować go do javascript w celu przetestowania. Skompiluj z folderu, w którym piszesz kod. Na przykład użyłem nazwy folderu / www / projekt. Więc CD do tego folderu i uruchom: 'transcrypt -b your_python_script.py'. To umieszcza dane wyjściowe w podfolderze o nazwie
__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ład
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(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():
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.