블로그 이미지
훅크선장

카테고리

분류 전체보기 (362)
사진이야기 (23)
펭귄컴퓨팅 (121)
컴퓨터보안 (84)
절름발이 프로그래머 (59)
C언어, C++ 과 Visual C+.. (12)
C# .net (1)
Delphi (40)
Python (5)
하드웨어개조 (23)
멀알려줄까 (35)
홈베이킹&홈쿠킹 (2)
잡다한것들 (15)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

태그목록

최근에 올라온 글

Python 2.x 대에서 3.x 대로 오면서 달라진 것이 있었습니다.

socket send() 함수와 recv()함수에서 주고받는 데이터 형식이 무조건 바이트 형식으로 바뀌었습니다.

그래서 기존 2.x 소스를 약간 수정하여야 합니다.

참고한 소스는 http://www.prasannatech.net/2008/07/socket-programming-tutorial.html 에 있는 파이썬 소스들입니다.

수정된 소스들은 다음과 같습니다.
TCP Server Code:
# TCP server example
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 5000))
server_socket.listen(5)

print ("TCPServer Waiting for client on port 5000")

while 1:
client_socket, address = server_socket.accept()
print ("I got a connection from ", address)
while 1:
data = input('SEND( TYPE q or Q to Quit):')
if(data == 'Q' or data == 'q'):
client_socket.send (data.encode())
client_socket.close()
break;
else:
client_socket.send(data.encode())
data = client_socket.recv(512).decode()
if(data == 'q' or data == 'Q'):
client_socket.close()
break;
else:
print ("RECEIVED:" , data)
break;
server_socket.close()
print("SOCKET closed... END")

TCP Client Code:
# TCP client example
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("www.hsd.or.kr", 5000))
while 1:
    data = client_socket.recv(512).decode()
    if ( data == 'q' or data == 'Q'):
        client_socket.close()
        break;
    else:
        print ("RECEIVED:" , data)
        data = input ( "SEND( TYPE q or Q to Quit):" )
        if ( data == 'q' or data == 'Q'):
            client_socket.send(data.encode())
            client_socket.close()
            break;
        else:
            client_socket.send(data.encode())
print ("socket colsed... END.")
Posted by 훅크선장
, |
를 참고했습니다.

python 2.3 이하 버전에서 주로 쓰던 방법은 spawn 계열 함수를 이용합니다. 
python 2.4 이상에서는 Popen 함수 또는 call 함수를 이용합니다.

가능하면,  spawn 계열보다는 Popen이나 call을 이용하기를 권장하고 있습니다.

import Popen from subprocess

P_NOWAIT example:
pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid

P_WAIT example:
retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
==>
retcode = call(["/bin/mycmd", "myarg"])

Vector example:
os.spawnvp(os.P_NOWAIT, path, args)
==>
Popen([path] + args[1:])

Environment example:
os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})


실제 사용해 보니,
Popen(["c:\progdir\prog.exe", ("%d" % int_val), ("%s" % str_val)], cwd =  "c:\progdir\\")

라고 쓰는게 가장 안정적이다.
cwd 변수는 프로그램의 실행디렉토리를 지정하는 것으로, 프로그램이 그 디렉토리에서 실행되는 효과를 가진다.
Posted by 훅크선장
, |
바로 앞에 MySQL-Python에 대해서 글을 썼는데,
대세는 ODBC인것 같다.

그래서, 바로 ODBC를 Python과 연결하고, MySQL 사용 환경을 구성했다.

먼저 Python에서 ODBC를 사용하는 방법은 간단하다.
pyODBC 프로젝트가 존재한다.
프로젝트 홈이 http://pyodbc.sourceforge.net/ 이었다가,
구글쪽으로 넘어왔다.  http://code.google.com/p/pyodbc/
현재 버전은 2.1.6이다.

다음 MySQL ODBC 드라이버가 필요하다.
이건 MySQL에서 제공하고 있다.

다운받는데, 로그인하라는 메시지가 있어서, 검색으로 미러사이트에서 직접 가져오는 것이 편하다.

MySQL ODBC 설정은 다음 사이트에서 아주 잘 설명하고 있다. (한글로.)
위 사이트가 안되면,
MySQL에서 제공하는 영문 매뉴얼을 참고하면 된다.

이상으로 설치 완료.

사용하는 방법은 다음과 같이 할 수 있다. pyODBC 페이지에서 위키로 제공하고 있다.
자세한 설명서는 다음에서 볼 수 있다.



Posted by 훅크선장
, |
에 있는 글을 참고로 하였습니다.


# MySQL-Python 모듈 호출
import MySQLdb

# DB접속
db = MySQLdb.connect(db='DB명', user='사용자명', passwd='비밀번호', host='서버IP 또는 서버명')

# 커서생성
cursor = db.cursor() # 모든 DB 작업은 커서를 통해서...

# SQL 문 실행, 여러행을 넣을 수도 있고,
cursor.execute('''
SQL 문장;
''')

# 또는 select 구문을 한 행으로 실행
cursor.execute('select ....;')

# 결과 행수를 알아보기
cursor.rowcount 

# 각 필드 특징 알아보기 (필드명,데이터형_코드, 표시크기, 내부크기, 정확도, 비율, nullable)
cursor.description 

# 결과를 하나씩 가져오기, 더이상 레코드 없으면 None
# 결과값은 튜플로 반환
cursor.fetchone()
# n 개의 결과. 튜플의 튜플
curor.fetchmany(n)
# 결과 전체, 만약 이전에 다른 fetch문이 있었다면 남은 결과의 전체
# 튜플의 튜플 
cursor.fetchall()

# 결과들을 하나씩 보는 방법
recs = cursor.fetchall()
for rec in recs:
print rec

# 튜플이 아닌 사전 형식으로 필드 가져오기
cursor = db.cursor(MySQLdb.cursors.DictCursor)
# 위 형태로 커서를 가져오면 fetch*() 메소드 실행 결과가 필드명을 키로 한 사전이다.
 
#데이터베이스 커밋 및 롤백
db.commit()
db.rollback()

# DB 작업 종료
cursor.close()
db.close()
Posted by 훅크선장
, |
Python에서 MySQL 데이터베이스를 다룰 수 있는 방법이 존재한다.
바로 MySQL-Python 모듈을 이용하면 된다.

Python 내에서 모듈명은 MySQLdb 이다. (대소문자 구별)
다만, 설치하기가 약간 까다롭라고나 할까?

Python 2.5 버전을 사용한다면, 자동 설치되는 exe 또는 msi 파일이 제공되지만,
Python 2.6 최신 버전(2.x 대에서 최신?)을 사용하면, 일일히 모든 패키지를 설치해야 된다.
그냥 설치가 아니라, 별도로 필요한 것들이 좀 있다.

먼저 당연하게 Python은 설치되어 있어야 한다.

먼저 필요한 파이썬 모듈은 setuptools이다.
글쓰는 시점에서 가장 최신인 0.6c9 버전으로 설치한다.

패키지를 tar.gz로 받아서, 압축을 풀고,
c:\> \python2.6\python.exe  setup.py  install
하면 설치가 된다.

그리고, 필요한 것이 MySQL 과 VS2008  C++ 이다.
MySQL 접속 모듈이니깐, MySQL이 필요한 건 이해하는데,
공개소스 프로젝트가 왠 Visual Studio 2008?? 적잖이 이해할 수 없는 상황이기 하다.
왜냐하면, MySQL-Python 모듈은 MySQL의 C 접속 API들을 단순히 Python용으로 변환시킨 것이다 보니, C 컴파일러가 필요한 것이다.
VS2008 C++은 무료버전인 Express Edition이 존재한다.
받아서 깔아야 한다.

최신버전이 5.1이지만, 난 개인적 호환성 이유로 5.0을 사용했다.

Visual C++ 2008 Express Edition을 받는다. Korean으로 받는게 좋지 않겠는가?

위의 두 프로그램을 설치하였으면,
MySQL-Python을 설치한다.
현재 안정버전은 1.2.2 인데, 이것을 설치하면,
sets 모듈과의 문제가 발생한다. 
그래서, 베타버전인 1.2.3c1 을 사용한다.

tar.gz 파일을 받아서, 압축을 푼 다음,
c:\> \python2.6\python.exe  setup.py  install
하면 된다.

주의 : 만약에 MySQL 5.0 버전 이외의 다른 버전을 사용한다면,
         site.cfg 파일에서 레지스트리 키 값을 별도 설정해주어야 한다.

Posted by 훅크선장
, |