다음은 Brython 대 Transcrypt (2016 년 7 월, OP에 의해이 질문에 대한 옵션으로 Transcrypt가 추가 된 이후)에 대한 정보이며, 몇 달 전에 Brython과 함께 프로젝트를 시작하고 Transcrypt로 이동하여 수집했습니다 (지난주에 이동 완료). 나는 Brython과 Transcrypt를 좋아하고 둘 다에 대한 용도를 볼 수 있습니다.
이것에 익숙하지 않은 사람들을 위해, Brython과 Transcrypt는 자바 스크립트에 'transpile'python 입력을 둘 다 (편집 : Brython을 '브라우저를위한 Python 구현'으로 보는 것이 더 낫습니다. 왜냐하면 그것은 독립형 자바 스크립트를 생성하지 않기 때문입니다). 둘 다 Python 3 구문이 필요합니다. Brython에는 상당한 수의 Python 표준 라이브러리가 포함되어 있으며 일부는 웹 관련 작업을 처리하기 위해 자체 소유 한 반면 Transcrypt는 대부분이를 피하고 대신 Javascript 라이브러리 사용을 제안합니다.
Brython ( Github)는 브라우저에서 변환 할 수 있습니다. 그래서 당신은 파이썬으로 작성하고 brython.js 엔진은 페이지가로드 될 때 즉시 자바 스크립트로 변환합니다. 이것은 정말 편리하고 생각보다 훨씬 빠릅니다. 그러나 페이지에 포함해야하는 brython.js 엔진은 약 500Kb입니다. 또한 Brython이 XHR 요청으로 별도의 .js 파일을 가져와 처리하는 표준 라이브러리를 가져 오는 문제도 있습니다. 일부 libs는 이미 brython.js로 컴파일되어 있으므로 모든 가져 오기가 새 파일을 가져 오는 것은 아니지만 많은 가져 오기를 사용하면 상황이 느려질 수 있습니다. 그러나이를 해결하는 방법이 있습니다. 내가 한 일은 브라우저 개발 도구의 네트워크 탭을 확인하여 페이지가로드 될 때 어떤 파일이 가져 왔는지 확인한 다음 Brython src 폴더의 복사본에서 내 프로젝트에서 사용하지 않는 모든 파일을 삭제했습니다. 사용 가능한 모든 라이브러리를 html에서 링크해야하는 py_VFS.js라는 하나의 파일로 컴파일하는 Brython에 포함 된 스크립트 (Brython / www / scripts / make_VFS.py에있는 것 같습니다)를 실행합니다. 일반적으로 2MB 이상의 거대한 파일이 생성되지만 사용하지 않는 파일을 삭제하면 매우 작을 수 있습니다. 이렇게하면 brython.js, py_VFS.js 및 Python 코드 만 가져와야하며 추가 XHR 요청이 필요하지 않습니다.
반면 Transcrypt ( Github )는 파이썬 3 패키지 로 배포됩니다.수동으로 사용하거나 도구 체인에 연결하여 미리 파이썬을 자바 스크립트로 컴파일 할 수 있습니다. 따라서 Transcrypt를 사용하면 Python으로 작성하고 Python에 대해 transcrypt를 실행하면 프로젝트에서 연결할 수있는 자바 스크립트를 뱉어냅니다. 출력에 대한 일부 제어를 제공한다는 점에서도 기존 컴파일러와 비슷합니다. 예를 들어, ES6 또는 ES5로 컴파일하도록 선택하거나 소스 맵을 출력하도록 요청할 수 있습니다 (디버깅하는 동안 브라우저가 생성 된 자바 스크립트 코드의 내부에있는 해당 Python 코드로 직접 이동합니다.) Transcrypt의 자바 스크립트 출력은 매우 간결합니다 ( 또는 다른 말로하면 예쁘고 간결합니다). 제 경우에는 150kB의 파이썬이 165kB의 축소되지 않은 ES5 자바 스크립트로 변환됩니다. 비교하자면 내 프로젝트의 Brython 버전은 변환 후 약 800Kb를 사용했습니다.
그러나 Transcrypts 간결함의 이점을 얻으려면 문서를 조금 (정말 약간만) 읽어야합니다. 예를 들어 Transcrypt를 사용하면 dict, set 및 list와 같은 데이터 구조에 대한 Python의 '진실성'이 기본적으로 활성화되지 않으며 유형 검사와 관련된 잠재적 인 성능 문제로 인해이를 전역 적으로 활성화하는 것은 권장되지 않습니다. 명확성을 위해 : CPython에서 빈 dict, set 또는 list는 진리 값 False를 갖지만 Javascript에서는 'true'로 간주됩니다 .. 예 :
myList = []
if myList:
이 문제를 해결하는 방법에는 세 가지 이상이 있습니다.
- python을 javascript로 변환 할 때 -t 플래그를 사용하십시오.
- 코드 내에서
__pragma__(tconv)
또는을 사용 __pragma__(notconv)
하여 transcrypt 컴파일러에 로컬에서 Python과 유사한 진리 값으로의 자동 변환을 켜도록 지시하십시오.
- 진실 값을 확인하는 대신 len (myList)> 0을 확인하여 문제를 완전히 피하십시오 ... 아마도 대부분의 상황에서 괜찮을 것입니다.
맞아요, 그래서 제 프로젝트가 점점 커져서 성능 향상을 위해 미리 컴파일하고 싶었지만 Brython으로 그렇게하기가 어려웠습니다. (기술적으로는 가능하지만 온라인 편집기 를 사용 하고 자바 스크립트 버튼을 클릭하여 출력). 나는 그것을하고 project.html에서 생성 된 자바 스크립트에 연결했지만 어떤 이유로 작동하지 않았습니다. 또한 Brython의 오류 메시지를 이해하기 어렵 기 때문에이 단계가 실패한 후 어디에서 시작해야할지 몰랐습니다. 또한 출력 된 코드의 큰 크기와 brython 엔진의 크기가 나를 괴롭히기 시작했습니다. 그래서 저는 처음에는 더 높은 등급으로 보였던 Transcrypt를 자세히 살펴보기로 결정했습니다. 왜냐하면 즉시 시작하는 방법을 알려주는 멍청한 지침을 선호하기 때문입니다 (이후 추가되었습니다).
Python3.5를 설치 한 후 설정하는 주요 사항은 다음과 같습니다.
- venv (각 프로젝트에 더 적은 공간을 사용하는 virtualenv의 새로운 내장 버전과 비슷 함)를 사용하여 python3.5 프로젝트 폴더를 설정합니다 (입력 : python3.5 -m venv foldername- 3.5의 패키지 문제가있는 우분투 해결 방법) ). 이것은 무엇보다도 bin 하위 폴더와 함께 'foldername'을 만듭니다.
- pip ( 'foldername / bin / pip install transcrypt')로 Transcrypt python 패키지를 설치하여 foldername / lib / python3.5 / site-packages / transcrypt에 설치합니다.
activate
매번 foldername / bin / python3.5의 전체 경로를 입력 할 필요가없는 경우 현재 터미널. 'source foldername / bin / activate'를 입력하여 활성화합니다.
- 코드 작성을 시작하고 테스트를 위해 자바 스크립트로 컴파일합니다. 코드를 작성한 폴더 내에서 컴파일하십시오. 예를 들어, 나는 foldername / www / project를 사용했습니다. 따라서 해당 폴더에 CD를 넣고 'transcrypt -b your_python_script.py'를 실행하십시오. 그러면 출력이라는 하위 폴더에 저장
__javascript__
됩니다. 그런 다음 HTML에서 출력 된 javascript에 연결할 수 있습니다.
이동하는 주요 문제
나는 다소 간단한 요구 사항이 있으므로 귀하의 마일리지가 다를 수 있습니다.
brython 또는 python 표준 libs를 javascript libs로 대체해야합니다. 예를 들어 'import json'은 Brython에서 제공하지만 Transcrypt에서는 javascript lib를 사용하거나 Python 코드에서 직접 JSON.parse / JSON.stringify를 사용할 수 있습니다. Python 코드에 직접 축소 된 버전의 자바 스크립트 라이브러리를 포함하려면 다음 형식을 사용하세요 (세 개의 따옴표에 유의하세요).
__pragma__ ('js', '{}', '''
// javascript code
''')
Brython의 html 특정 기능은 Transcrypt에서 분명히 작동하지 않습니다. 일반적인 자바 스크립트 방식을 사용하세요. 예 : 1) Brython에서 'document ['id ']'를 사용하여 특정 HTML 태그를 참조했을 수 있지만 Transcrypt를 사용하면 'document.getElementById ('id ')를 사용합니다. 그것은 자바 스크립트에서). 2) 'del nodeName'(Brython 함수 인 BC)으로 노드를 삭제할 수 없습니다. 'node.parentNode.removeChild (node)'와 같은 것을 사용하십시오. 3) brython의 모든 DOM 함수를 자바 스크립트 대안으로 대체합니다. 예 : class_name = className; text = textContent; html = innerHTML; 부모 = parentNode; children = childNodes 등. 일부 오래된 브라우저에서 요구하는 대안을 포함하는 것이 필요한 경우이를위한 javascript 라이브러리가 있습니다. 4) Brython의 set_timeout은 javascripts setTimeout으로 대체됩니다. 5) BR ()과 같은 Brython의 html 태그는 일반적인 자바 스크립트 방식을 사용하여 교체해야하며 <= dom 조작 구문을 사용한 모든 위치를 다시 실행해야합니다. 일반 텍스트 마크 업을 innerHTML로 삽입하거나 javascript 구문을 사용하여 요소를 만든 다음 일반 javascript DOM 구문을 사용하여 첨부합니다. 또한 체크 박스의 경우 brython이 "if 체크 박스 = 'checked':"를 사용하지만 Transcrypt는 "if 체크 박스 :"에 만족합니다 .. 일반 텍스트 마크 업을 innerHTML로 삽입하거나 javascript 구문을 사용하여 요소를 만든 다음 일반 javascript DOM 구문을 사용하여 첨부합니다. 또한 체크 박스의 경우 brython이 "if 체크 박스 = 'checked':"를 사용하지만 Transcrypt는 "if 체크 박스 :"에 만족합니다. 일반 텍스트 마크 업을 innerHTML로 삽입하거나 javascript 구문을 사용하여 요소를 만든 다음 일반 javascript DOM 구문을 사용하여 첨부합니다. 또한 체크 박스의 경우 brython이 "if 체크 박스 = 'checked':"를 사용하지만 Transcrypt는 "if 체크 박스 :"에 만족합니다.
나는 지난주에 Transcrypt가 몇 가지 사소한 것 (필러로 대체하기에 충분히 쉬웠지만)에 대한 지원이 없었던 2700 라인 프로젝트 이동을 마쳤으며, 이들은 1) str.lower, str.split (str. 분할이 존재하지만 파이썬 버전과 다르게 작동하는 자바 스크립트 분할 인 것 같습니다. str, int 및 float에서는 작동하지 않으며 dict, list 및 set에서만 작동합니다. 4) Brython과의 또 다른 차이점은 내가 dict의 JSON 표현을 가져 오면 'myDict = dict (data)'를 사용하여 그렇게해야하는 반면 brython은 'myDict = data'에 만족한다는 것입니다. 그러나 그것은 Brython의 json.loads의 무언가와 관련이있을 수 있으며, JSON.parse로 직접 대체했습니다.__pragma__('opov')
로컬의 경우) 오버로드 된 형식을 사용하여 집합 연산과 같은 작업을 수행 할 수 없지만 해당 함수를 사용해야합니다. 예
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) 또한 기본적으로 'for i in dict :'를 사용하여 dict를 반복 할 수 없습니다 (cmd line -i 또는 __pragma__('iconv')
).하지만 keys () 멤버를 사용하여 활성화하지 않아도됩니다. 예 :
for key, value in dict.items():
요약하자면
나는 Brython을 좋아합니다. 왜냐하면 그것을 사용하고 코드를 테스트하는 것이 쉽기 때문입니다 (F5 만). 대부분의 표준 lib가 있기 때문에 진정한 파이썬에 더 가깝습니다. 브라우저에 트랜스 파일 엔진 (편집 : 또는 파이썬 VM으로 볼 수 있음)을 포함해야하는 것과 큰 출력 자바 스크립트 크기를 포함해야하는 것을 싫어합니다. 작업을 계속해야한다면 (하지만 여전히 Brython을 사용), brython 메서드에 너무 많이 의존하는 대신 자바 스크립트 메서드를 사용하여 brython에서 DOM을 조작했을 것입니다. 내 요구가 변경되면 다른 트랜스 파일러에게.
저는 Transcrypt를 좋아합니다. 왜냐하면 출력 된 자바 스크립트가 실제로 '가볍고 비열한'것이고 브라우저 측에서로드하는 유일한 것은 파이썬 코드와 크기가 비슷한 생성 된 자바 스크립트 코드이기 때문입니다. 또한 소스 맵을 지원하고 출력 된 자바 스크립트에 대한 제어 수단을 제공하기 때문입니다. 그리고 그것을 사용하여 최적화에 대해 꽤 배웠습니다.
누군가가 자신의 특정 프로젝트에 어떤 것이 좋은지 알 수 있기를 바랍니다.