오늘은 통계 숙제를 하다가, math.e math.log 이런 것 누르려다 보니, import math하기가 갑자기 무지 귀찮았습니다. 맥에서는
파이썬 대화모드는 거의 항상 WidgetTerm에 항상 띄워두고 쓰지만, math나 urllib같이 늘 쓰는 모듈을 쓸 때에도 import하고 쓰는게 그렇게 귀찮았구나~ 하고 옛날 생각도 나면서.. 흐흐
그래서 예전에 올라왔던 자동 들여오기 PEP가 생각나서 봤는데, 게으른 모듈(lazy module)을 일일이 다 만드는 방법으로 처리해서, 소스가 상당히 길고 설치하기가 귀찮더군요. 그래서, sys.excepthook을 써서 어떻게 NameError를 잘 지지고 볶으면 될 것 같아서. 한번 해 봤습니다~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# use as a PYTHONSTARTUP script for your interactive env. import sys, re def autoimp(tp, value, tb, orighook=sys.__excepthook__, re=re): if tp is NameError: name = re.findall("name '([^.']+)'", value[0])[0] frame = tb.tb_frame try: mod = __import__(name) except ImportError: pass else: print "[[ Module '%s' is implicitly loaded. ]]" % name frame.f_locals[name] = mod exec frame.f_code in frame.f_globals, frame.f_locals return # bypass the exception to the original handler orighook(tp, value, tb) sys.excepthook = autoimp del sys, autoimp, re |
실행해 보면~
1 2 3 4 5 6 7 8 9 10 11 12 |
% PYTHONSTARTUP=autoimp.py python Python 2.4.4 (#2, Apr 4 2007, 23:05:50) [GCC 3.4.6 [FreeBSD] 20060305] on freebsd6 Type "help", "copyright", "credits" or "license" for more information. >>> math.log(math.pi) [[ Module 'math' is implicitly loaded. ]] 1.1447298858494002 >>> math.sqrt(_) 1.0699205044532047 >>> len(urllib.urlopen('http://openlook.org').read()) [[ Module 'urllib' is implicitly loaded. ]] 42911 |
적당히 디스크 어딘가에 풀어두고, PYTHONSTARTUP 환경변수로 파일이름(전체경로)를 써 주시면 되겠습니다. 셸 프로파일에 적어주시면 편합니다~ ^^
주의사항: 여러 줄 블럭이거나 한 줄에라도 부작용(side effect)이 있는 코드이면 원래 의도와 다르게 동작할 수 있습니다.
역퍼! _ ;
모듈 임포트 버그는 줄일 수 있겠군용
멋져부렁~
머.. 멋집니다!
저는 막상 맥을 쓰면서도 맥에서 파이썬 쓰는 게 너무 불편해서 회사컴에서만 씁니다. ;;;
맥에서 파이썬 환경을 어떻게 꾸며놓고 사용하시는지 한 번 올려주시면 기쁘겠습니다. ^^
PyPy 프로젝트의 일부로 시작된 Py 라이브러리에서도 비슷한 기능을 제공하고 있는데, 대화모드에서만 쓰는데는 이 글의 방법이 더 간단하네요.
http://codespeak.net/py/dist/misc.html#the-py-std-hook
c.l.py에 올라온 autoimp 모듈은 py.std와 별 차별점이 없는 것 같은데 그냥 바퀴를 다시 만든건지, 무슨 다른 이유가 있는지 궁금합니다.
오오오오옷! ㅋㅋ 감사합니다! 저도 맥에서 어떻게 파이썬 쓰는지 알고 싶네요 ㅋ