-m 실행 옵션과 __name__
·
Python
Python 관련 글들을 보다 보면 스크립트를 실행시킬 때 어떤 때는 python3 script.py처럼 실행시키고, 어떤 때는 python3 -m script처럼 -m 옵션을 사용해서 실행시킬 때가 있습니다. 차이는 무엇일까요? 전자는 script.py를 실행시키는 것이고, 후자는 script라는 이름의 모듈을 sys.path에서 찾아서 실행시키는 것입니다. sys.path에 대한 설명은 알쏭달쏭 Python import - sys.path을 참고하세요. 오늘도 간략한 예시를 들어서 알아보겠습니다. 1. 간단한 함수부터 아래와 같은 Python 코드를 만들고 있다고 가정해보겠습니다. 주어진 문자열 주위를 아름답고 화려한 *으로 감싸주는 코드입니다. import sys def print_with_bord..
venv는 내부적으로 어떻게 작동할까?
·
Python
Python의 모듈 간 의존성 문제를 해결하기 위해서 virtualenv나 venv를 많이 사용하실 겁니다. 시스템에 설치된 모듈들과 virtual environment 내에 설치된 모듈들을 분리해주기 때문에 모듈들이 꼬일 걱정 없이 사용할 수 있어서 참 좋습니다. 개인적으로 저는 새 Python 프로젝트를 시작하면 venv와 git 초기화를 꼭 실행합니다. 그런데 가끔 내부적으로 어떻게 이 기능이 작동하는지 궁금할 때가 있습니다. 그래서 오늘은 venv가 어떻게 작동하는지 한번 알아보겠습니다. (virtualenv도 작동 방식은 거의 동일합니다.) 1. venv를 만들자 먼저 아래 명령으로 virtual environment를 만듭니다. python3 -m venv env 그럼 현재 디렉터리에 env ..
bad magic number in 'application': b'\x03\xf3\r\n': ImportError
·
Python
자주 겪는 문제는 아니지만 종종 python에서 bad magic number in 'application': b'\x03\xf3\r\n': ImportError가 날 때가 있습니다. 이 에러는 python 2.x 대 버전으로 만들어진 *.pyc 파일을 python 3.x 대 버전으로 실행시키려고 할 때 발생합니다. "python main.py" 명령으로 main.py를 실행시킴. main.py는 다른 모듈들을 import 함. python 명령은 python 2.x 버전이고, 이 과정에에서 python 2.x 대에 맞는 *.pyc 파일들이 생성됨 python 2.x가 아닌 python 3.x를 써야했다는 생각이 떠올라서 "python3 main.py" 명령으로 다시 main.py를 실행시킴 bad ma..
알쏭달쏭 Python import - sys.path
·
Python
Python으로 만들고 있는 프로그램이 커지기 시작하면 모듈화를 합니다. 이 기능, 저 기능을 모아서 하나의 파일로 합쳐서 모듈(*.py)로 만들지요. 모든 모듈들이 한 디렉터리에 있을 때는 아무 문제없이 행복합니다. 그러다가 조금 더 프로그램이 커지면 모듈들을 모아서 패키지(디렉터리)로 만들고 슬슬 문제가 시작됩니다. 멀쩡히 import 되던 모듈들이 찾을 수 없다며 import가 되지 않거나 , 엉뚱하게 동작하는 일들이 생기죠. 이것이 다 python의 sys.path 때문입니다. 1. sys.path 누구냐 넌 sys.path는 모듈을 import 할 때 모듈을 찾아야할 경로들을 저장해둔 list입니다. 예를 들어 sys.path가 ['directory_A', 'directory_B', 'direc..
함수의 인자를 특정 값으로 고정하기 - functools.partial
·
Python
일반적으로 쓸 일이 많지는 않지만, 함수를 higher-order function 형태 (lambda, decorator 등 함수 자체를 하나의 객체로 취급하는 경우)로 쓰다 보면, 기존 함수를 재활용하는 경우가 왕왕 있습니다. 한 가지 예는 기존 함수의 특정 인자를 특정값으로 고정시키는 경우죠. 예를 들어, 아래와 같은 코드를 보겠습니다. def print_characters(char, repeat): print(char * repeat) print_characters('*', 10) ********** 별을 10개가 아니라 20개를 출력하고 싶다면? print_characters('*', 20) 그런데 왜인지 무조건 별을 20개 출력하는 함수를 만들고 싶어졌습니다. def print_character..
함수 이름으로 함수 호출하기
·
Python
함수 이름을 알고 있을 때, 그 이름으로 함수를 호출하고 싶을 때가 있습니다. 예를 들어, 함수의 이름이 tokenize 일 때 이 함수를 어떻게 호출할 수 있을까요? 당연히 아래와 같이 호출합니다. tokenize() 너무나 당연하죠. 그런데 가끔 다르게 호출하고 싶을 수도 있습니다. 이렇게요. f = getattr(sys.modules[__name__], 'tokenize') f() 굳이 왜죠. 왜 이렇게 어렵게. 프로그램 실행 중 동적으로 함수 이름을 알아내고, 이 함수를 호출해야 할 때가 있습니다. 예를 들어 한국어 토큰의 단위는 뭐가 좋을까? 에서 tokenize_by_morpheme_jaso, tokenize_by_morpheme_char, tokenize_by_eojeol_jaso, toke..