YUDA't

0. pypy.js


input()을 하면 EOFError를 일으킨다!



1. brython

http://brython.info/index.html (공식 사이트가 느리고 허접하다. 그래도 에디터나 콘솔을 테스트해볼 수 있음)

https://github.com/brython-dev/brython (1,308 stars)

만약 웹에서 파이썬 에디터나 콘솔을 만들고 싶다면 pypy.js보다는 이걸 더 추천한다.

사용한 지 좀 돼서 가물가물하긴 하지만, pypy.js보다 사용 방법이 더 간단하고 input()처리가 가능하다.

다만 input()을 웹 alert 창으로 받아서...좀 읭스럽긴 하다.


html에 이렇게 brython.js를 가져온다.

헌데 위의 스크립트는 오직 파이썬 기본 문법만을 돌릴 수 있기에, 만약 모듈을 임포트하고 싶다면 이렇게 brython_stdlib.js도 함께 가져와야 한다.

그리고 body 태그에 다음과 같이 brython()을 가져오고, 적당한 태그 안에 파이썬 코드를 넣어준다.

print(123)

그 다음엔 다음과 같이 script type을 "text/python"으로 두고 파이썬 명령어를 집어넣으면 된다.

이런 식으로 사용한다.

웹 브라우저에 접근해야 해서 기존 파이썬에서는 잘 쓰지 않는 좀 생소한 모듈을 쓴다.

그리고 print된 것들이 다 console.log로 출력돼서 만약 이 값들을 가져오고 싶으면 따로 조치를 취해야 한다.(이게 은근 복잡함..내 경우에는 로컬에 brython.js를 직접 넣어서 uglify된 코드를 뒤져가며 고쳤는데....더 좋은 방법이 있을 것이다)



2. python-shell

node.js의 모듈 중 하나.

위의 라이브러리들이 client단의 javascript를 기반으로 돌아간다면, 이는 server단의 node.js를 기반으로 돌아간다.

정말 간단하게 파이썬 코드를 컴파일 할 수 있다.(사용방법은 위의 npm 페이지나 github에 다 나와있음)

위의 라이브러리들에서는 불가능하거나 애매하게 작동했던 python input()도 사용가능


다만 node.js로만 python-shell을 돌린다면 콘솔에서 stdin을 바로 받아낼 수 있어 굉장히 쉽지만,

웹에서 사용할 경우, 웹과 데이터를 주고 받아야 하기 때문에 socket.io 통신을 어느 정도 공부해야 원활하게 사용할 수 있다.


+ jq-console

온라인 파이썬 컴파일러를 제공하는 많은 사이트들이 jq-console을 이용한다.

하지만 jq-console에서 파이썬 컴파일러에 대한 라이브러리를 제공하진 않는 듯하다.

그래서 repl.it 나 코드카데미 등 유명한 사이트들이 아니면 제대로 쓰는 경우를 못 봤고, 대부분 brython을 이용하거나 어찌어찌 허술하게 만듦

특히 input 쪽은 굉장히 취약하다.



3. skulpt

https://github.com/skulpt/skulpt

javascript만으로 돌아간다.

굉장히 편리하지만 python 2 만 지원한다.


다음과 같이 js 파일들을 알아서 넣어주고,


이런 식으로 skulpt를 실행시켜주면 된다.
참고로 outf()는 output을 어떻게 할지 각자 짜주면 됨.
function outf(text) {
  let ouput = iframe.parent().parent().find('.ace-output');
  ouput.append(text);
}
function builtinRead(x) {
  if (Sk.builtinFiles === undefined || Sk.builtinFiles["files"][x] === undefined)
    throw "File not found: '" + x + "'";
  return Sk.builtinFiles["files"][x];
}
function runit() {
  let prog = editor.getValue();
  let mypre = iframe.parent().parent().find('.ace-output');
  mypre.html('');
  Sk.pre = "output";
  Sk.configure({output:outf, read:builtinRead});
  try {
    Sk.importMainWithBody("", false, prog);
  } catch (e) {
    mypre.html(e.toString());
  }
}