반응형

Programming/Python 16

왜 Python에는 GIL이 있는가

Python 사용자라면 한 번 쯤은 들어봤을 (안 들어봤다 해도 괜찮아요) 악명 높은 GIL (Global Interpreter Lock)에 대해 정리해본다. Global Interpreter Lock그래서 GIL은 무엇인가? Python Wiki에서는 이렇게 말한다. In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not threa..

Programming/Python 2018.06.02

왜 Python은 len 함수가 따로 있을까? Duck Typing과 Python Protocol

여기 Python list가 하나 있다. array = list(range(10000)) Python을 아는 사람이라면, array의 길이를 얻는 방법은 다음과 같이 간단하다는 것을 알 것이다. length_or_array = len(array) # == 10000 C++이나 Java 등의 다른 객체형 언어를 먼저 알고 있었다면 이런 의문이 들 수 있다. "array.size 또는 array.length 같이 안 하고 왜 len이라는 함수를 쓰지?" 질문에 대한 답을 하기 전에 먼저 코드 몇 뭉치를 보고 오는 게 더 좋을 것 같다. 1. len은 __len__을 호출한다. class ClassWithLen: def __init__(self, *items): self.storage = list(items)..

Programming/Python 2018.02.12

Python 계의 npm, Pipenv 첫 사용 후기

virtualenv + virtualenvwrapper를 통해 Python 가상 환경을 사용해왔었다. 사용하면서 딱히 불편한 점은 없었지만 가끔은 npm과 같이 기본적으로 고립된 환경과 비교하게 되는 때도 있었다. 일일이 가상 환경을 만든 것을 기억하고 관리하기가 조금 귀찮은 순간도 있는 것이다. 이렇게 npm, cargo 등의 여러 모듈 관리자의 좋은 점들을 모아서 더 나은 개발 환경을 제공하기 위해 Pipenv가 탄생했다고 한다. Requests 모듈의 창시자이자, flask 등의 유명한 Python 도구 개발에 참여하고, "The Hitchhiker's Guide to Python" 이라는 제목으로 책도 낸 Kenneth Reitz의 프로젝트 중 하나인 Pipenv를 눈 여겨 보고 있었다. 언젠가 ..

Programming/Python 2017.12.21

django admin에서 ForeignKey 선택 제한

다음과 같은 models.py가 있다. from django.contrib.auth.models import User class Article(models.Model): user = models.ForeignKey(User) title = models.CharField(max_length=50) content = models.TextField() created = models.DateTimeField(auto_now_add=True) 누가 블로그 같은 것을 만들었나보다. 위 model을 토대로 django admin 도구는 user 필드를 선택 위젯으로 나타내준다. 사용자가 많아지면, 만약 만 명이라고 생각해보면, 거기서 원하는 한 명을 선택하는 것은 매우 좋지 못한 일이다. 이를 피하기 위해서 어떻게 ..

Programming/Python 2017.02.18

python json 모듈 사용시 not JSON serializable 에러를 피하는 방법

웹 기반 python 코드를 짜다 보면, 특히 다른 쪽 API와 통신을 자주 하게 된다면 json 모듈을 많이 이용하게 된다. python이 기본적으로 지원하는 데이터 타입인 list와 dictionary 구조를 유지한 채 json 형식으로 바꿔주고, 그 반대로 json 문자열을 해독해서 python 데이터 타입으로 바꿔주는 역할을 하는 것이 python의 json 모듈이다. import json data = {'key': ['value1', 'value2']} json_data = json.dumps(data) # json string from python data python_data = json.loads(json_data) # get python data back from json string a..

Programming/Python 2016.12.12

Python Postgresql adapter, psycopg2 설치 (Linux/Windows)

오픈소스 관계형 데이터베이스로 널리 쓰이고 있는 Postgresql을 python에서 작동할 수 있도록 도와주는 psycopg2의 설치법을 linux와 windows 환경에 따라 정리한다. 본래 Postgresql이 linux 환경에 잘 맞는 데이터베이스이기 때문에 linux에서의 설치는 크게 어렵지 않다. windows에서는 특히 가상 환경을 이용할 때에 설치하는 방법을 기록하기 위해 이 글을 쓴다.Linux(Ubuntu 16.04 LTS) 환경pypi (python package installer)를 이용해서 간편히 설치할 수 있다. # 기본 python 환경에서 설치 $ pip install psycopg2 # 가상 환경 virtualenv에서 설치 $ source venv/bin/activate ..

Programming/Python 2016.11.02

Python virtualenv 정리 (Linux/Windows)

python의 가상환경 virtualenv 모듈의 사용법을 간단하게 정리한다. python의 가상환경이란, 작은 python을 새로 설치해서 내가 원하는 모듈만 운용하는 바구니라고 생각하면 된다. 운영체제 안에서 새로 운영체제를 만들어내는 가상 머신(virtual machine)과 같은 맥락이라고 볼 수 있다. 같은 모듈이라도 이 버젼 저 버젼 다른 버젼이 필요할 때나, python 프로그램을 실행하기 위한 최소한의 환경을 마련하고자 할 때, 그리고 github 등의 저장소와 연계하고자 할 때 등 가상환경은 매우 다양하게 사용될 수 있다. 이젠 필수적인 요소가 된 python 가상 환경의 리눅스/윈도우에서의 사용법을 정리한다. (본인이 윈도우에서 쓰려고 할 때마다 까먹어서....) 리눅스(ubuntu) ..

Programming/Python 2016.11.01

django management 시스템 안에서 내 명령어 만들고 사용하기

django 프로젝트를 만들다보면, 테스트를 위해 필요할 때마다 django shell을 통해서 일시적인 코딩이 필요할 때가 많다. 게다가 그 코딩을 반복적으로 사용해야 할 경우가 많은데, 그 때마다 django shell에서 같은 코드를 실행시키는 것이 꽤나 불편하고 비효율적일 수 있다. 이 글에서는 django management 시스템에 내가 필요한 명령어를 만들고 사용하는 법을 정리한다.사용할 코드DB에서 뭔가를 빼와서 그 내용을 출력하는 작업을 예제로 삼겠다. DB에 아이템을 하나씩 추가할 때마다 그 아이템을 확인하고자 하는 상황이다. django shell을 통해서 다음과 같은 코드를 통해 테스트를 할 수 있을 것이다. $ python manage.py shell >>> from myapp.m..

Programming/Python 2016.10.09

Python Celery with Redis: 비동기 작업 큐(queue)

비동기 작업 큐(queue)를 python에서 활용할 수 있는 celery를 소개한다. 웹서버가 처리하기엔 무거운 연산(e.g. pdf 변환, 과학적 계산 프로세스 등)을 그냥 서버에 집어넣으면 사용자는 웹서버의 처리가 다 끝날 때 까지 빙빙 돌고있는 웹브라우저를 하염없이 바라보고만 있어야 할 것이다. 왜냐하면 웹서버의 작업은 동기적(synchronous)이기 때문이다. 반대로 비동기적 (asynchronous)인 작업이라는 것은 어딘가에 작업을 던져주고 그 작업이 끝나길 기다리지 않고 다른 일을 할 수 있다는 것이다. 그 예로 태생부터 비동기적인 javascript가 있다. 그리고 작업이 끝났는 지 지속적인 체크를 하다가 끝나면 그 결과물을 받으면 된다. celery는 메시지 브로커(message br..

Programming/Python 2016.09.25

Python requests 모듈 간단 정리

Python에서 HTTP 요청을 보내는 모듈인 requests를 간단하게 정리하고자 한다. 0. 기본적인 사용 방법 import requests URL = 'http://www.tistory.com' response = requests.get(URL) response.status_code response.text 웹브라우져에서 티스토리를 접속한 것과 똑같은 이야기이다. www.tistory.com 이라는 주소로 GET 요청(request)를 보냈고 서버에서는 그 요청을 받아 뭔가를 처리한 후 요청자인 나에게 응답(response)를 줬다. 우선 그 응답은 200 상태코드와 함께 왔다. 이는 티스토리 서버에서 잘 처리되어서 정상적인 응답을 보내줬다는 OK 싸인을 의미한다. 그리고 응답의 내용은? 보시다시피..

Programming/Python 2016.08.10