Home » python

python

Pillow 기본 사용법

PIL은 (아마 짐작이 가능하겠지만) Python Imaging Library의 약자로, 파이썬에서 여러 포맷의 이미지를 읽고 조작할 수 있게 하는 라이브러리이다. GUI 관련 라이브러리/프레임워크들이 일부 이미지 조작과 관련한 기능을 제공하긴 했지만, 2000년대 초반에 ‘파이썬스럽게’ 이미지를 처리할 수 있고, 가장 많은 기능을 사용할 수 있었다. 그러나 행복한 나날은 오래가지 못했는데, 2009년쯤해서 PIL은 더이상 새 버전이 릴리즈 되지 않았다.

더 보기 »Pillow 기본 사용법

prompt toolkit을 사용하는 비동기 입력 프롬프트

prompt_toolkit은 asyncio를 지원하는 prompt_async()를 제공한다. input() 함수나 보통의 prompt() 함수는 입력을 받는 중에는 스레드 전체를 블럭하기 때문에 다른 동작이 모두 멈추게 된다. prompt_async()는 이러한 문제를 해결할 수 있는 대안이다. 참고로 patch_stdout()을 사용하면 입력을 기다리는 중에 다른 코루틴이 출력을 할 수 있게 하면서, 입력 중간에 출력되는 내용 때문에 입력 프롬프트가 망가지는 것을 방지할 수 있다. (단 코루틴에서 print()를 통해 출력한 경우만 제대로 작동하는 것 같고, print_formatted_text()를 쓰면 좀 꼬이는 거 같긴 하다…) 위 코드에서 task1은 1초마다 화면에 문구를 반복해서 출력한다. task2에서는… 더 보기 »prompt toolkit을 사용하는 비동기 입력 프롬프트

PUB-SUB 패턴에서 멀티파트 데이터를 사용하기

PUB-SUB 소켓은 데이터를 발송하는 복수의 Publisher와 이를 수신하는 역시 복수의 Subscriber들이 연결되어 데이터를 분산하는 ZMQ 패턴에 사용된다. 이들은 REQ-REP 패턴과 다르게 PUB쪽에서 SUB쪽으로 단방향으로 데이터가 전송되며, PUSH-PULL과 다르게 하나의 메시지를 모든 Subscriber가 수신한다는 특징이 있다. 이 때, SUB쪽 소켓은 자신에게 맞는 데이터만을 수신하도록 필터를 설정하는데, 보통 PUB-SUB 패턴의 예제에서는 이 필터를 문자열이나 바이트로 설정하여 일치하는 경우만 수신하도록 한다.

더 보기 »PUB-SUB 패턴에서 멀티파트 데이터를 사용하기

같은 것을 포함하는 순열 생성기 (Python)

OOO, XX 로 만들 수 있는 5글자 문자열을 모두 생성하는 방법을 소개한다. 총 5개의 글자로 만들 수 있는 순열은 5! (120) 가지이다. 그런데 같은 O 끼리와 같은 X 끼리는 구분할 수 없으므로 실제로는 5!/(3! * 2!) 가지로 10가지의 조합만 가능할 것이다. 파이썬의 itertools 에서는 순열, 조합 및 중복 순열과 중복 조합을 만드는 함수가 제공되지만 같은 것을 포함하는 순열을 생성하는 함수는 제공되지 않는다. 중복된 원소가 있을 때, 중복 없는 순열을 만드는 방법은 다음과 같이 생각해 볼 수 있다. OOOXX 의 5글자로… 더 보기 »같은 것을 포함하는 순열 생성기 (Python)

vim에서 터미널로 코드를 실행하기

vim에서 파이썬이나 자바스크립트 코드를 작성하고 바로 실행하는 가장 쉬운 방법은 :!python % 과 같이 외부 명령을 바로 호출하는 것이다. 이 경우 vim은 잠시 숨겨지고 해당 명령을 실행하는 상태로 화면이 전환된다.

보다 IDE와 비슷한 느낌(느낌 알잖아요…)이 중요하다면 vim내에서 창을 나누고 그 창에서 실행 결과를 보는 방법이 있다. vim8에서 도입된 job 기능을 사용하여 백그라운드에서 해당 프로그램이 실행되면 그 결과를 새 버퍼로 받아서 보여주는 방법도 있고, 또 아예 :term 명령으로 해당 파일을 여는 방법도 있다.

더 보기 »vim에서 터미널로 코드를 실행하기

ZMQ 프록시 사용하기

ZMQ 디바이스를 사용하여 네트워크를 확장하는 예를 살펴본 적이 있었는데, zmq.device()는 이제 deprecated 되었고 대신에 zmq.proxy()를 사용하라는 내용을 공식문서에서 보게 되었다. 단지 device에서 proxy로 이름이 바뀐 것인가 싶었는데, 프록시는 zmq 디바이스보다 좀 더 오픈되고 유연한 형태의 네트워크 중계 장치이며, 사용도 더 간편하기 때문에 소개하고자 한다.

더 보기 »ZMQ 프록시 사용하기

(Python) prompt_toolkit 사용법

prompt_toolkit은 xNIX 계열의 쉘에서 사용되는 readline 라이브러리를 순수 파이썬으로 구현한 것으로 명령줄 도구를 사용할 때 히스토리 탐색이나 자동 추천, 자동 완성등의 기능을 쓸 수 있게 해주는 라이브러리이다. readline 자체가 제공하는 기능이 워낙 다양하고 유용하기 때문에 대화형 쉘과 같은 프로그램을 매우 쉽게 만들 수 있게 해준다. prompt toolkit의 제작자는 이 라이브러리의 기능을 활용하여 ptpython이라는 개선된 파이썬 대화형 쉘을 제작하였으며, vim의 기능을 흉내낸 pyvim 프로젝트도 개발하고 있다. (공식문서보기)

prompt_toolkit은 입력 프롬프트 상에서 표시되는 내용과 입력에 대한 검증을 실시간으로 가능하게 하기 때문에, 입력을 특정한 규격에 맞춰야 하는 프로그램에서 아주 유용하다. 또한 텍스트에 컬러를 지정하는 것도 가능하며, 입력 중인 내용에 대해 구문 강조를 적용하는 것도 가능하기 때문에 예쁜 CLI 프로그램을 만드는데 도움을 준다.

오늘은 prompt_toolkit에 대해 좀 알아보도록 하자.

더 보기 »(Python) prompt_toolkit 사용법

matplotlib의 기본 사용법 및 다른 시각화 라이브러리

오늘은 파이썬의 시각화 부분에서 가장 널리 쓰이고 있는 matplotlib에 대해서 알아보도록 하자.

matplotlib을 사용할 때 주로 서브패키지인 pyplot을 사용한다. pyplot은 MATLAB의 인터페이스와 유사하게 작동할 수 있도록 하여 MATLAB을 사용하는 사용자층이 쉽게 matplotlib으로 옮겨오도록 하고 있다. 문제는 MATLAB의 인터페이스가 그모양이어서 그런지 모르겠는데, matplotlib의 인터페이스가 일관성도 없는 편이고 그다지 객체지향적이지도 않아서 사실상 API 문서만으로도 사용이 어렵고 관련 예제를 보면서 코드를 따라써야 하는 수준으로 처리해야 하는 경우가 많다는 것이다.

더 보기 »matplotlib의 기본 사용법 및 다른 시각화 라이브러리

파이썬으로 이진 탐색 구현하기

이진 탐색(binary search)은 정렬된 데이터에서 특정한 값을 아주 빠르게 찾는 방법이다. N개의 데이터 중에서 특정한 값 x를 찾을 때, 최악의 경우 N번의 비교가 필요한데, 이진 탐색의 경우 최대 log_{2}N만큼의 비교를 하게 된다. 즉 자료의 크기가 클수록 선형 탐색에 비해 성능이 매우 우수해진다. 다만 이진 탐색은 자료가 정렬되어 있다는 전제가 필요하다. (이 때문에 컴퓨터 과학에서는 정렬이 매우 중요하고, 성능이 좋은 정렬 알고리듬을 만들기 위해 많은 노력이 있어왔다.)

더 보기 »파이썬으로 이진 탐색 구현하기

컨디션을 통한 스레드 동기화 예제

동시성을 다룰 때에는 특정한 자원을 동시에 액세스하지 못하도록 관리하거나 여러 작업들이 시작되는 시점을 맞추는 동기화 수단이 필요할 수 있다. Lock은 특정 코드 영역을 동시에 여러 스레드가 실행하지 못하도록 보호할 때 사용하며, 이벤트는 여러 스레드들이 특정 이벤트가 발생할 때까지 기다리다가 동시에 시작될 수 있도록 한다. 컨디션(Condition)은 락과 이벤트가 결합되어 있는 동기화 수단이다.

컨디션은 락을 내재하고 있는 이벤트라 할 수 있다. 락과 마찬가지로 acquire() ~ release() 구간이 있어 한 번에 하나의 스레드/프로세스가 실행되는 영역을 만들 수 있는데, 그 사이에 wait()를 통해서 이벤트를 기다릴 수 있다. 이때 한 스레드가 락을 잠근 상태에서 wait()를 호출하여 이벤트를 기다리게 되면, 같은 컨디션 객체를 점유하고자 하는 스레드가 다시 락을 얻어서 크리티컬 영역에 진입할 수 있다. 이와 같은 방식으로 여러 스레드가 크리티컬 영역에서 이벤트를 기다리는 상태가 될 때, 누군가가 해당 컨디션 이벤트를 set()하게 되면 대기 중인 모든 스레드가 깨어나게 된다. 하지만 이들은 모두 같은 크리티컬 영역에서 대기 중이었기 때문에 일반 이벤트와 달리 한꺼번에 동시에 시작하지 않고, 한 번에 하나씩 크리티컬 영역의 코드를 실행한다. 깨어난 스레드가 락을 릴리즈하는 시점에 wait()를 끝낸 다른 스레드가 실행되는 식으로 순차적으로 크리티컬 구간을 지나게 된다.

더 보기 »컨디션을 통한 스레드 동기화 예제