콘텐츠로 건너뛰기
Home » Development » Python » Page 12

Python

Subprocess 모듈 사용법 – 파이썬에서 서브 프로세스를 생성하기

Subprocess 모듈 이란?

subprocess 모듈은 파이썬 프로그램 내에서 새로운 프로세스를 스폰하고 여기에 입출력 파이프를 연결하며 리턴코드를 획득할 수 있도록 하는 모듈로, 다른 언어로 만들어진 프로그램을 통합, 제어할 수 있게 만드는 모듈이다. 이 모듈은 기존에 오랜된 몇몇 모듈과 함수(os.system, os.spawn*)들을 대체하기 위해 만들어졌다. (혹은 os.popen 같은 함수도…)

더 보기 »Subprocess 모듈 사용법 – 파이썬에서 서브 프로세스를 생성하기

파이썬의 이름공간과 변수의 스코프

네임스페이스(name space, 이름공간)이란 프로그래밍 언어에서 특정한 엔티티를 이름에 따라 구분할 수 있는 범위를 말하는 것이다. 소스코드를 작성할 때 가장 어려운 일 중 하나는 변수나 함수의 이름을 정하는 것인데, 충돌이 발생하지 않도록 변수/함수의 이름을 모두 유니크하게 만드는 것은 현실적으로 불가능하다. 모든 이름을 외우고 있기도 어렵거니와, 여러 사람이 협업하는 경우에 다른 사람이 쓸 이름까지 다 알 수는 없기 때문이다.

그래서 프로그래밍언어에서는 네임스페이스라는 개념을 도입하여, 특정한 하나의 이름이 통용될 수 있는 범위를 제한한다. 따라서 소속된 네임스페이스가 다르다면 같은 이름이 다른 개체를 가리키도록 하는 것이 가능해진다.

더 보기 »파이썬의 이름공간과 변수의 스코프

파이썬에서 제네릭 함수 정의하기 – singledispatch

어떤 하나의 함수 (혹은 겉으로 보기에 이름이 다른 여러 다른 함수)가 여러 타입의 인자를 받고, 인자의 타입에 따라 적절한 동작을 하는 함수를 제네릭 함수라고 한다. C++이나 Swift에 이런 제네릭 관련 기능이 언어 레벨에서 지원되는데, 사실 파이썬은 동적 타입 언어이기 때문에 언어수준의 명시적인 제네릭 지원 기능은 없다.1 파이썬의 제네릭 비록 파이썬이 동적 타입 언어이기는 하지만, 파이썬 내에는 제네릭과 비슷한 함수들이 있다. 기본 함수 중 len() 함수는 리스트, 집합, 사전, 문자열 등 타입에 대해 객체의 길이값을 구할 수 있다. 이 때 길이는 구하는 방법은… 더 보기 »파이썬에서 제네릭 함수 정의하기 – singledispatch

대기오염 정보 파싱하기

대기오염 정보를 가져다가 파싱해보자. 대기오염 실시간 예보 사이트인 airkorea에서 우리동네 예보 페이지를 뜯어보니 아래와 같은 주소로 데이터를 json으로 받아오고 있었다.

http://www.airkorea.or.kr/web/pollution/getRealChart
?dateDiv=1
&period=1
&stationCode=823652

여기서 stationCode는 관측소 코드가 된다. 집에서 그나마 가까운 검단 관측소의 코드는 823652였다. 더 보기 »대기오염 정보 파싱하기

괄호를 처리할 수 있는 사칙연산 계산기 (Python)

파이썬으로 간단한 사칙연산 계산기를 만들어보자. 실질적으로는 간단한 계산을 명령줄에서 수행할 수 있는 계산기가 필요해서 (계산기 앱을 실행하는게 귀찮…) 만들어보기로 했다.

실질적으로 간단한 덧셈, 나눗셈이 아니라, 다항식을 계산하고, 괄호가 들어있는 수식을 계산하는 기능이 필요했다. 따라서입력 자체는 명령줄 인자로 받으며, 가능한 한 ‘관대하게’ 처리하고자 했다.

이를 위해서는 입력받은 식을 공백이나 연산기호를 구분점으로 파싱하고, 후위식으로 변환한 후 이 후위식을 하나의 항으로 계산한 다음, 그 결과를 출력해주면 된다. 이들 각각의 과정을 함수로 만들고 최종적으로 하나의 코드로 조립해나간다.

더 보기 »괄호를 처리할 수 있는 사칙연산 계산기 (Python)

제너레이터 타입검사 (파이썬)

[[코루틴과 병렬처리]]에서 잠깐 다뤘지만, 제너레이터 타입인지를 검사하기 위해서는 types 모듈의 GeneratorType 클래스를 이용하면 된다. someGenerator = someGeneratorFunc() import types isassert isinstance(someGenerator, types.GeneratorType)

argparse – Python 명령줄도구의 인자분석

케이스별 실제 사용 예 위주로 정리한 새 글이 있으니 참고하세요.

argparse

https://docs.python.org/3/library/argparse.html?highlight=argparse#module-argparse

CLI툴을 만들 때 다양한 옵션 스위치들을 제공하려는 경우, 이를 일일이 파싱1하는 것은 사실 쉽지 않다.파이썬에서는 argparse 모듈이 이러한 작업을 보다 편하게 할 수 있게 도와준다. 더 보기 »argparse – Python 명령줄도구의 인자분석

파이썬의 제너레이터와 코루틴

파이썬 제너레이터는 특별한 종류의 함수 객체이다. 함수 내부에서 yield 구문을 사용하여 특정 값을 내놓은 후에도 실행을 종료하지 않아 제거되지 않고, 다시 그 자리에서부터 이어서 계산을 반복하고 다시 값을 내놓을 수 있다. rangemap, filter 등의 객체가 제너레이터의 일종이라고 할 수 있다.

아주 먼 옛날, 파이썬 2.5에서 제너레이터에 특별한 기능이 생겼는데, 바로 제너레이터 속으로 값을 전달하는 기능이다. (PEP342) 이는 매우 흥미로운 패턴으로 이어지게 되는데, 실행 중 한 번 yield 문을 만나 자신의 위치를 기억하고 있다가 다시 그 자리에서 실행이 가능하다는 점에서 두 개 이상의 제너레이터가 서로 값을 주고 받으면서 교차식으로 실행하는 것이 가능하다. 이는 일반적인 함수 호출의 패턴인 주 루틴 – 서브 루틴의 관계와 달리 두 개의 루틴이 함께 실행된다는 부분에서 코루틴(coroutine)이라고 부른다.

코루틴은 사실 완전히 새롭게 등장한 개념은 아니었다. 이미 6~70년대에 기반이 닦여진 기술이이었다. 당시에는 작업 흐름의 분산을 위한 여러 가지 개념들이 도입되고 시도되고 있었는데, 이 당시에 이러한 기술들 중에서 가장 환호를 받았던 것은 다름 아닌 멀티스레드였다.

멀티스레드가 큰 인기를 얻고 발전해 나가면서 상대적으로 코루틴은 거의 방치되다 시피하였으나, 규모가 커짐에 따라 멀티 스레드는 자원 경쟁이라든지 동기화문제 등 더 큰 골칫거리를 가져왔다. 이러한 문제로 인해 코루틴 개념은 그린릿(greenlet)이나 경량스레드(lightweight thread)라는 이름으로 재발견되어 주목받는 경우도 있다.

코루틴이 흥미로운 지점은 멀티스레드 없이 하나의 스레드 위에 여러 개의 실행흐름이 존재할 수 있다는 것이다. 즉 멀티스레드에서의 골치 아픈 문제들을 끌어들이지 않고서도 실행 흐름을 분산할 수 있다는 것을 의미한다.

하지만 분산처리와 같은 상황이 아니더라도 제너레이터 혹은 코루틴은 파이썬 프로그래밍에서 매우 중요한 비중을 차지한다. 멀티스레드와 같은 적극적인 동시성이 아니더라도, 제너레이터의 ‘느긋한(lazy)’한 특성은 실제로는 concurrent 하지 않은 작업들을 마치 동시에 진행되는 것처럼 다룰 수 있게 하며, 무거운 연산을 가능한 뒤로 미루어 실행 시간내의 체감 퍼포먼스가 좋은 것처럼 보일 수 있게 한다. (사실 이정도면 충분한 것이, 파이썬의 멀티스레드는 실제로는 동시에 실행되지 않기 때문이다.)

이 외에도 제너레이터와 코루틴은 간단한 클래스를 대체할 수 있으며, 일련의 처리 과정에서의 단위 작업을 구성하고 이들을 선언적으로 연결하는 방법으로도 활용할 수 있다. 오늘 이 글에서는 제너레이터와 코루틴에 대해 알아보도록 하자.

더 보기 »파이썬의 제너레이터와 코루틴

파이썬의 새로운 병렬처리 API – Concurrent.futures

컴퓨터 프로그램이 어떤 일을 처리해 나가는 실행 흐름은 기본적으로 선형이다. 서브루틴을 실행하는 것은 실질적으로 현재의 실행흐름이 해당 루틴의 단계까지 내려갔다가 다시 복귀하는 것이며, 하나의 CPU는 마치 고속도로에서 차선을 바꿔타듯 코드를 진행하며 작업을 처리해나간다. 하지만 두 개의 차선에서 동시에 다른 작업이 진행되어야 하는 상황이 언젠가는 필요할 수 있을 것이다.

이전에는 이것을 ‘동시성’이라 불렀고, 파이썬에서는 기본적으로 threading.ThreadMultiprocessing.Process 를 이용해서 다중 스레드 및 다중 프로세스를 통해서 동시성 작업을 처리했다. 이들 라이브러리 이전에 _thread 라는 저수준 API가 존재했었지만, 지금은 잊어도 좋을 것 같다.

파이썬 3.2에서는 ‘동시성’에 관한 개념을 발전시킨 고수준 API를 제공하여 더 나은 형태의 코드를 작성할 수 있게끔해주는데, 그것이 바로 오늘 소개할 concurrent.futures 라이브러리이다.

이 새로운 API는 기존의 멀티스레드 관련 API를 완전히 대체하지는 않는다. concurrent 모듈은 여전히 내부적으로 _thread와 같은 기존 API에 의존하고 있는 것도 사실이며, 스레드나 프로세스를 저수준에서 세세하게 제어하는 수단을 모두 제공하지도 않는다.

다만 주목할 것은 자바스크립트의 Promise 개념과 비슷한 Future라는 개념을 도입했고, 결과적으로 분산처리 및 그외 동시성에 관련된 코드를 좀 더 편하게 작성할 수 있게 해준다.

더 보기 »파이썬의 새로운 병렬처리 API – Concurrent.futures

체를 사용하여 소수 집합 구하기

가장 빠른 알고리듬 현재까지 순수 파이썬으로 작성된 알고리듬 중 가장 빠른 것으로 알려진 것은 @Robert William Hanks가 개발한 아래 알고리듬이다. def primes(n): """Return a list of primes under n""" sieve = [True] * (n/2) for i in xrange(3, int(n**0.5)+1, 2): if sieve[i/2]: sieve[i*i/2::i] = [False] * ((n-i*i-1)/(2*i)+1) return [2] + [2*i+1 for i in xrange(1, n/2) if sieve[i]]