Thursday, July 30, 2015

import pymssql UnicodeDecodeError: 'ascii' Error.

pymssql을 python 2.7 에서 import 하려고 하면

UnicodeDecoeError: 'ascii' .... 하는 오류가 나타난다면

그 컴퓨터의 이름에 ascii로 표현 불가능한 문자가 있어서 그렇다.


이걸로 2일 삽질했다. 젠장.. 어떤 개새끼가 컴퓨터 이름에다가 한글 썼어,, 아우.. 미쳐버리겠네. 씨발놈새끼 뒤져라. 컴퓨터 이름, 프로젝트 파일 이름, 템포러리 디렉토리 이름에다가 영문 숫자 이외 다른 글자 넣는 새끼 만나면 뒤진다.




컴퓨터 이름을 영문과 숫자로만 채우면 해결됨.

--------------------------------------------------------------------------
>>> import pymssql
....
UnicodeDecodeError: 'ascii' Error


Change your computer name to simple alphabet and numeric


Wednesday, July 29, 2015

인간적으로 우리 UTF-8만 쓰자.

euc-kr 이고 cp949고 나발이고 죽겠다.

그냥 utf-8만 쓰자.

8bit character를 위해 만든 프로그램에서도 왠만하면 다 되잖어..

아... character set 때문에 하루 완전 날렸네.

오랫만에 삽질했다. 한여름 서버실에서 추위에 떨면서.


pymssql 에서 한글 깨짐 문제. (pymssql.OperationalError 20017 'DB-Lib error message 20017, Unexpected EOF from the server)


import pymssql

conn = pymssql.connect(host='192.168.11.101', user='user', password='password', database='db',charset='utf8')

위 와 같이 작성해서 돌렸는데 아래와 같은 메시지를 만난다면?

pymssql.OperationalError: (20017, 'DB-Lib error message 20017, severity 9:\nUnexpected EOF from the server\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n')

mssql 에 접속할때 charset이 안맞아서 그렇다.

utf8 대신에 charset='ISO-8859-1' 로 수정해서 다시 시도해본다.
그래도 안되면 charset 항목을 제외시켜도 본다.

한글을 사용하는 경우 왠만하면 빼거나, utf8 이거나 ISO-8859-1 로 해서 될것임.

문제는 데이터베이스에서 자료를 읽으면 한글이 

"Á¦±æ"  요런식으로 깨진다는것.

이 현상은 한글(euc-kr / cp949)이 ISO-8859-1로 인코딩 되어서 그런것임. 이것을 euc-kr로 변환 했다가 다시 utf-8로 변환해서 보여주면됨.

    t = row["fieldname"]
    t = t.encode('ISO-8859-1')
    t=t.decode('euc-kr')
    print(t)



그런데 connect 할때  charset을 utf8로 하지 않으면 한글이 깨지고 난리 법석이다.
utf8만 쓰는게 답이다.


예제 소스 코드
--------------------------------------------------------
#-*- coding: utf-8 -*-
__author__ = 'kdw'

import pymssql

conn = pymssql.connect(host='???????, user='????', password='????', database='???',charset='utf8')

cur = conn.cursor(as_dict=True)
cur.execute("select '제길' as damm")
row = cur.fetchone()
while row:
    t = row["damm"]
    print(t) 
    t = t.encode('ISO-8859-1')
    t=t.decode('euc-kr')
    print (t)

    row = cur.fetchone()

cur.close()
cur = None

결과: ---------------------------------------------------------------------
C:\Python27\python.exe C:/Users/kdw/PycharmProjects/untitled/test.py

Á¦±æ
제길

Process finished with exit code 0



===========================================
In English 
===========================================

change connect "charset" parameter, try again

recommand charset:
ISO-8859-1
utf8



Thursday, July 2, 2015

Raspberry pi, python에서 공유메모리 사용하기 (Python shared memory usage)

Install python sysv_ipc module

#일단, 최신버전으로 시스템 업데이트
sudo apt-get update


#python-dev 설치
sudo apt-get install python-dev

#pip 설치( 어떻게 하는지는 나도 모르겠다. 알아서 하세요)

#pip를 통해 sysv_ipc 모듈 설치
sudo pip install sysv_ipc



#이제 사용하면됨

#아래는 python예제 ( 공유 메모리 만드는 방법 )

import sysv_ipc

memory = sysv_ipc.SharedMemory( 1234, flags=01000,size=10 ,mode=0600)
#읽기
vari = memory.read()
print(vari[0])

#쓰기
memory.write("abcdefg")



#아래는 공유메모리를 얻어다 쓰는놈

import sysv_ipc

memory = sysv_ipc.SharedMemory( 1234)
#읽기
vari = memory.read()
print(vari[0])

#쓰기
memory.write("abcdefg")


-----------------------------------
#install sysv_ipc via pip
sudo pip install sysv_ipc


example (shared memory creator):

import sysv_ipc

# for creator of shared memory.     1234 is unique key
memory = sysv_ipc.SharedMemory( 1234, flags=01000,size=10 ,mode=0600)

# read
vari = memory.read()

#write
memory.write("abcdefg")



example (shared memory user):
import sysv_ipc

# for user of shared memory
memory = sysv_ipc.SharedMemory( 1234 )  # only key number needs

# read
vari = memory.read()

#write
memory.write("abcdefg")






example (shared memory creator and user):
import sysv_ipc

# open shared memory by key
memory = sysv_ipc.SharedMemory( 1234 )  # only key number needs
# not exists shared memory. so create it.
if(memory == None):
     memory = sysv_ipc.SharedMemory( 1234, flags=01000,size=10 ,mode=0600)
# read
vari = memory.read()

#write
memory.write("abcdefg")