라벨이 Python인 게시물 표시

PyPy RPython Translation Toolchain

이미지
그 동안 PyPy를 단순히 JIT을 지원하는 빠른 python implementation 이라고만 알고 있었다. 그런데 알고 보니 단순한 python implementation 이상의 의미를 갖는 상당히 멋있는 프로젝트였다. PyPy는 2가지 파트로 나뉜다. 1. RPython 문법으로 작성된 Python Interpreter 2. RPython Translation Toolchain 1번의 python interpreter를 2번의 toolchain에 넣으면, JIT, garbage collector 등의 기능이 첨가된 C언어로 된 interpreter가 결과로서 나온다. ???!!  매우 놀라울 것이다. 2번의 toolchain은 Python 소스 코드나 syntax trees 에 대한 정보는 전혀 가지고 있지 않는다. 그런데 JIT과 garbage collector를 비롯한 기능들을 첨가해준다니?! 그래서 내가 멋있다고 한 것이다... (출처 : https://www.toptal.com/python/why-are-there-so-many-pythons) PyPy의 구조를 그림으로 보자면 위와 같다. (PyPy Interpreter가 1번, PyPy compiler가 2번에 해당한다.) (출처 : http://rpython.readthedocs.io/en/latest/translation.html) RPython translation toolchain의 실제 플로우를 그림으로 보자면 위와 같다. 기본적으로 RPython으로 작성된 interpreter 코드가 필요하고 추가적으로 low level hint들을 통해 세부적인 과정에 참여할 수 있다. 그리고 translation toolchain의 backend는 현재 C언어만 가능하지만, 설계 상 더 추가가 가능한 구조이다. 그리고 이러한 RPython Translation Toolchain을 이용하면 Python 뿐만 아니라 모든 언어들의 'JIT'ed Inter...

BeautifulSoup4를 relative import하는 방법

이미지
BeautifulSoup4를 relative import 할 일이 있었다. 근데 하려했는데 안됐다. (4.4.0, 4.4.1 버전을 이용해봤는데 둘 다 안됐다.) 그 이유는 bs4/builder/__init__.py 에서 from bs4.element import ... 을 하기 때문이다. 즉, bs4 내부 코드에서 bs4의 하부 모듈을 import할 때, 절대경로로 import하기 때문이다.  이 것을 from ..element import ... 처럼 상대경로로 import하도록 수정해야 문제가 발생하지 않는다. 내부적으로 이런 코드가 얼마나 존재할 지를 몰라서, 아래와 같은 코드를 bs4 내에 추가하여 해결하였다. 하지만 이는 깔끔한 해결책은 아니고, 실제로 bs4 내에서 bs4의 하부모듈을 import할 때 relative import를 하도록 코드를 수정해야지 진정한 해결책이 될 것이다. bs4/builder/__init__.py 의 맨 위에 추가 bs4/__init__.py 의 맨 위에 추가 실제로 내가 이 문제를 만났을 때에는 전역적으로 bs4가 설치되어 있어서 위와 같은 import에러는 안뜨고 자꾸 html.parser가 없다는 이상한 에러가 떴다. 그래서 bs4의 코드를 순차적으로 따라가면서 겨우 근본적인 원인을 찾아냈다... ㅠㅠ https://groups.google.com/forum/#!topic/beautifulsoup/n1bFLxqn7SE 그래서 일단 이런 이슈를 community에 남겨놓았다. 혹시 이 것이 나중 버전에 반영이 될 지 안 될지는 모르겠지만,  반영이 안되더라도 bs4를 relative import하고 싶을 땐 위와 같이 하면 될 것 같다.