virtualenv 설치시 오류(locale)

2018. 2. 5. 17:24 from Dev/python

virtualenv 등 이것저것 설치시 locale 오류나는 경우에는 표준으로 세팅을 해주어야 합니다. 

이 경우 locale 커맨드로 확인해보시면 locale 세팅이 안되어 있거나 한데, 보통 en-US로 바꿔주시면 대부분의 문제는 해결이 됩니다: 

export LC_ALL="en_US.UTF-8"



Posted by banasun :

[python/django] Form class 이용시 html 소스 추가

2017. 2. 22. 16:50 from Dev/python

Django의 ModelForm을 이용하다 보면 기본 양식으로는 사용하기 편하고 좋은데, 세세하게 주위 디자인과 맞춰주려면 어떡해야 할지 여기저기 찾아봐도 잘 나오지 않습니다.


저는 bootstrap에서 form을 이용해야 해서, form field에 class = "form-control"을 각 위젯마다 추가해주어야 하는데, 아래와 같은 방식으로 처리하였습니다:


class SupplierForm(ModelForm):
    class Meta:
        model = Supplier
        fields = ['name', 'memo', 'status', ]

    def __init__(self, *args, **kwargs):
        super(ModelForm, self).__init__(*args, **kwargs)
        self.fields['name'].widget.attrs.update({
            'class': 'form-control'
        })


ModelForm을 상속하였기 때문에, __init__에서 super의 __init__를 call 해주고, 각 필드의 속성을 update 해주는 방식으로 하니 되는군요. 좀더 복잡하게 추가하는 것도 가능합니다.

Posted by banasun :

pip으로 mysql-connector-python 설치

2015. 2. 7. 01:06 from Dev/python

binary로 설치할 때는 http://dev.mysql.com/downloads/connector/python/에서 OS별로 다운받아서 설치하면 됩니다.

제 Mac에서는 python2와 3을 동시에 사용하고 있어서.. pip으로 설치하는 방법을 찾았습니다:


pip3.4 install --allow-external mysql-connector-python mysql-connector-python


3rd party pip repo라 옵션이 붙어야 하는 것 같습니다.

Posted by banasun :

[python] euc-kr 파일을 읽어서 utf-8로 작업할 때

2015. 2. 6. 01:55 from Dev/python

정말이지 이놈의 encoding은..

며칠전에 우편번호를 db에 집어넣어야 하는데.. 받은 데이터가 euc-kr입니다.

바꾸어 주는 방법은 간단합니다. file handler를 fh라 할 때, readline()으로 읽어오면 한줄만 넣어주면 됩니다 :

line = fh.readline()

line = unicode(line, 'euc-kr').encode('utf-8')

이렇게 해주시면 됩니다.

왜 네이버 웹툰 '하루3컷'이 생각이 날까요? ㅋㅋ

Posted by banasun :

MySQL-python 설치하기 (Ubuntu)

2015. 1. 21. 17:53 from Dev/python

Ubuntu에서 mysql-python 설치하는 방법입니다. 아무것도 깔려있지 않은 깨끗한(?) 서버 상태일 때를 가정한 것입니다.



sudo apt-get install python-pip
sudo apt-get install python-dev
sudo apt-get install libmysqlclient-dev
sudo pip install MySQL-python

pip이 설치되어 있다면 1행은 건너 뛰셔도 됩니다.

Posted by banasun :

[python] 1시간 전 datetime 구하기

2015. 1. 7. 08:46 from Dev/python

지난번 포스팅에서 어제, 그저께 날짜를 datetime 포맷으로 구하여 보았습니다: (date format을 datetime format으로)

이번에는 짧게, 1시간 전은 어떻게 구할까요?



import datetime

now = datetime.datetime.now()
delta = datetime.timedelta(hours = 1)

print (now - delta)
Posted by banasun :

[python] version별로 module import 하기.. (python2 VS python3)

2015. 1. 4. 02:21 from Dev/python

Python 2에서 Python 3으로 넘어가면서 이것저것 많이 바뀌고 해서 익숙하게 사용하던 것도 바꾸어 주어야 하는 경우가 생깁니다.

아직까지 호스팅 하는 서버들은 Python2.7 정도를 서비스 하는 곳이 많은데.. 사실 개발용 PC에는 Python3을 쓰게 되지요. 계속 2를 붙잡고 있을 수는 없는 노릇이라.. -0-

웬만하면 3에 맞추어서 코딩을 하면서 어쩔 수 없는 부분이 바로 module 부분입니다. 오늘은 간단하게 버전별로 모듈을 따로 써보겠습니다. 정확히 하면 하나로 import 했다가 에러나면 '에구구' 하고 다른 버전용을 import하는 꼼수지요.

Python 3에서는 urldecode를 하려면 urllib.parse.unquote을 써야 하고, Python 2에서는 urllib.unquote를 사용해야 합니다. 이럴 경우에 다음과 같이 정의해주면 됩니다 :



try:
    from urllib import unquote
except ImportError:
    from urllib.parse import unquote


물론 명시적으로 version을 불러서 하는 방법도 생각해볼 수는 있겠지만, 이렇게 하는게 더 적당하지 않을까.. 하는 생각입니다. ^^

'Dev > python' 카테고리의 다른 글

MySQL-python 설치하기 (Ubuntu)  (1) 2015.01.21
[python] 1시간 전 datetime 구하기  (0) 2015.01.07
[python] date format을 datetime format으로  (0) 2015.01.03
[python] MySQL 연결  (0) 2014.09.05
[Algorithmic Thinking] Project 1  (0) 2014.09.05
Posted by banasun :

[python] date format을 datetime format으로

2015. 1. 3. 03:21 from Dev/python

개인적으로 코딩을 할 때 제일 재미없는 부분이 날짜, 문자열, 포맷변환 등등입니다. 이거만 누가 다해준다면 정말 빨리 일 끝낼텐데.. ^^

python에서 date --> datetime으로 변환하는 꼼수를 소개해드립니다 :

datetime.datetime에는 combine이라는 메소드가 있습니다. date와 time을 인수로 받아서 이에 맞는 datetime를 반환해주지요. 이걸 활용하는 방법입니다. 예로 어제 날짜에서 하루 전(그저께)를 받아보겠습니다



from datetime import datetime
from datetime import date

yesterday = date.today() - datetime.timedelta(1)
datetime.combine(yesterday, datetime.min.time())
Posted by banasun :

[python] MySQL 연결

2014. 9. 5. 13:00 from Dev/python

어제 python 관련 글 올린 김에 많은 분들이 찾으시는 MySQL 데이터베이스 이용과 관련된 내용을 정리해드립니다.

예전에 제가 프로그래밍으로 밥 벌어먹기 시작했을 때(!)에는 여러가지 DBMS가 많았습니다만, 이제는 LAMP니 뭐니 할 정도로 MySQL이 정석이 되었습니다. 실제로 제가 있었던 회사는 MySQL로 회원 수 천만이 넘는 사이트를 무리 없이 운영하니까요. 옛날에는 MySQL로 그 정도 규모의 상업적인 서비스를 한다 그러면 주위에서는 그거로 돌리면 불안해서 밤에 잠이 오겠냐, M$나 오라클 써라 했었는데요. ㅋㅋ

다 오픈소스의 힘이라고 생각합니다. 그만큼 보완이 많이 되고, 서비스를 하면서 경험이 축적되면서 개선이 되니까요. 개인적으로는 MongoDB로 개발을 하고 있는 부분이 있는데 Mongo가 더 재미있긴 하지만요.

각설하고, python에서 MySQL 이용하는 것과 관련해서 간단하게 정리해 보겠습니다.

많이 이용되고 있는 모듈은 

_mysql, MySQLdb

입니다.

_mysql은 C API를 이용하는 raw-level 모듈이고, MySQLdb는 _mysql 모듈을 포장한 wrapper입니다. 

연결은 

con = MySQLdb.connect('localhost', 'testuser', 'mypassword', 'mydbname')


이런 식으로 해주시면 되고, 연결 후에는 cursor를 생성하여 이용하시면 됩니다.

간단하게 예를 들어보면 아래와 같습니다:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
import sys

try:
    con = mdb.connect('localhost', 'dbuser', 'mypassword', 'mydb')
    
    cur = con.cursor()
    sql = "SELECT ID FROM articles ORDER BY ID DESC LIMIT 10"
    cur.execute(sql)
    for i in range(cur.rowcount):
        row = cur.fetchone()
        print row[0]

except mdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)


python의 dictionary type cursor를 이용하시려면 cursor 생성시에 다음과 같이 하시면 됩니다.

cur = con.cursor(mdb.cursors.DictCursor)


(Update) MySQLdb module 설치는 다음 포스팅을 참조하세요:

http://banasun.tistory.com/entry/MySQLpython-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-Ubuntu

Posted by banasun :

[Algorithmic Thinking] Project 1

2014. 9. 5. 01:55 from Dev/python

머리가 굳는 느낌이라 COURSERA를 통해서 RICE university의 Algorithmic Thinking 이라는 강의를 수강하고 있음..

알고리즘 공부하면서 고생했던 것도 생각나고, 몇 년만에 python으로 짜다 보니 옛날 생각도 나고 하네.

오늘 module 1 숙제로 제출한 소스 기념으로 저장. ㅋㅋ

# Project 1 - Degree distribution for graphs

EX_GRAPH0 = {
             0 : set([1, 2]),
             1 : set([]),
             2 : set([])
             }

EX_GRAPH1 = {
             0 : set([1, 4, 5]),
             1 : set([2, 6]),
             2 : set([3]),
             3 : set([0]),
             4 : set([1]),
             5 : set([2]),
             6 : set([])
             }

EX_GRAPH2 = {
             0 : set([1, 4, 5]),
             1 : set([2, 6]),
             2 : set([3, 7]),
             3 : set([7]),
             4 : set([1]),
             5 : set([2]),
             6 : set([]),
             7 : set([3]),
             8 : set([1, 2]),
             9 : set([0,3,4,5,6,7])
             }

def make_complete_graph(num_nodes) :
# returns complete directed graph(dictionary) with {num_nodes} nodes
    result = {}
    for i in range(num_nodes):
        result[i] = set()
        for j in range(num_nodes):
            if (i <> j):
                result[i].add(j)
    return result

def compute_in_degrees(digraph) :
# returns in_degrees of each nodes in digraph
    result = {}
    for head in digraph:
        result[head] = 0
        for tail in digraph:
            if (head <> tail):	# no self-loop
                if head in digraph[tail] :
                    result[head] += 1
    return result

def in_degree_distribution(digraph) :
# returns unnormalized distribution table of the in-degrees of digraph
    result = {}
    in_degree_table = compute_in_degrees(digraph)
    print in_degree_table
    for key in in_degree_table :
        if result.has_key(in_degree_table[key]):
            result[in_degree_table[key]] += 1
        else:
            result[in_degree_table[key]] = 1
            
    return result


Posted by banasun :