everydayminder
twistedmatrix에서 callInThread()와 callFromThread()는 어떻게 다른 것일까? 무심코, 코드에서 callInThread()를 썼는데, 그 차이를 궁금해 하다가 문서 및 소스를 찾아보게 되었다. 1. The Twisted Documentation 보기 우선 살펴본, The Twisted Documentation에서는 callFromThread()는 thread-safe하지 않은 메소드를 thread-safe하게 실행시킬 때 사용한다고 한다. 다른 설명으로는, thread-safe하지 않은 메소드를 메인 이벤트 루프에서 실행되도록 스케쥴한다고 한다. from twisted.internet import reactor def notThreadSafe(x): """ do somet..
windows 자체도 DNS caching을 하므로, 콘솔에서 다음과 같이 입력한다. ipconfig /flushdns
현재 실행하는 클래스의 이름과 메소드 이름, 라인 넘버를 얻어보자. 클래스의 인스턴스에서 호출한다는 가정하에, def trace(obj, toList = False): import sys className = obj.__class__.__name__ methodName = callersname() lineNumber = sys.exc_info()[2].tb_lineno if toList: return className, methodName, lineNumber else: return "%s.%s[%d]" % (className, methodName, lineNumber) 단, callersname()은 def callersname(): return sys._getframe(2).f_code.co_name..
# 현재 함수의 이름 얻기 def whoami(): import sys return sys._getframe(1).f_code.co_name # 현재 함수의 caller 이름 얻기 def callersname(): import sys return sys._getframe(2).f_code.co_name 출처 : Python Recipe 66062: Determining Current Function Name
ElementTree와 같은 패키지를 사용하여 XML를 파싱하는 경우, XML 엘리먼트의 짝이 안맞는 등, 유효하지 않은 XML 구성이 탐지되면 ExpatError가 뜨는데, try: # XML 연산 catch ExpatError, e: # do something 하면, NameError: global name 'ExpatError' is not defined라는 에러가 뜬다. 이를 해결하려면, ExpatError를 catch하는 py 파일의 앞에, scope을 맞춰서 from xml.parsers.expat import ExpatError 라고 넣어주자. 그러면, 문제 해결!! '' While you are using XML packages such as ElementTree, you might wan..
ㅁ Queue.Queue 1. push('a') : 6.39s 2. push('a') + pop() : 11.37s ㅁ collections.dequeue 1. append('a') : 0.13s 2. append('a') + popleft() : 0.27s ㅁ list 1. append('a') : 0.15s 2. append('a') + pop() : 0.40s Queue를 쓰려면, dequeue를 활용하는 것이 좋을 것 같다.
여러가지 단위 테스트 프로그램이 존재하나, 그 중, standard library로 포함되어 있는 pyUnit (unittest) 과 py.test를 비교하여 간략하게 비교한다. ㅁ 테스트를 위한 클래스 class A: def getA(self): return 'a' def getWrongA(self): return 'b' if __name__ == '__main__': aa = A() print aa.getA() * 위의 코드에서 보는 바와 같이, 테스트 메소드는 두 개(getA와 getWrongA)이다. * 각 메소드는 정상 상황('a'를 리턴할 것이라 예상하는 상황에서 실제로 'a'를 리턴)과 오류 상황('a'를 리턴할 것이라 예상하는 상황에서 실제로는 'a'가 아닌 다른 값을 리턴)을 나타낸다. ..
1. 현재 클래스의 메소드 이름 얻기 class Base 에 대해, Base.__dict__ 라고 하면, Base에 선언된 정보를 얻을 수 있으나, 이중, 메소드 이름만 추출하고 싶다면, from types import * def getMethodNames(): result = [] for attr, val in Base.__dict__.items(): if type(val) == FunctionType: result.append(attr) return result 과 같이 함으로써, method 이름을 추출할 수 있다. 2. 그러나, 이미 특정 class로부터 instance를 만든 경우에는 위의 방법을 그대로 사용할 수 없다. 즉, Base.getMethodNames()라고 하면 결과를 얻을 수 있지..
1. 10.0.0.1에 접속 2. cat /proc/drbd -> primary인지 secondary인지 정보가 출력됨 3. drbdadm primary mysql -> primary로 전환 4. mount /dev/drbd0 /drbd/ 5. service mysql start
일단, Query를 실행하는 방법은 크게 두 가지를 쓸 수 있겠다. runQuery()를 사용하는 방법과, runInteraction()을 사용하는 방법이다. 주어진 table에서 10개의 row를 가져오고자 한다고 했을때, 1) runQuery() 사용하기 def getCount(): return dbpool.runQuery("select * from test") def printResult(l): if l: result = l[0][0] print l[0][0], " records" else: print "no rows fetched" dbpool = adbapi.ConnectionPool('MySQLdb', db='abcd', user='abcd', passwd='abcd') getCount().a..
linux에서 vi를 쓰다보면, 어디에 설치되었는지 모르는 웃지 못할 상황이 생기곤 한다. type/ which 명령어를 써도 명확히 알기 어렵다. 이럴 때!! vi를 실행시킨 상태에서 확인이 가능하다는 사실! :!echo $VIMRUNTIME
Twsited Matrix Framework 상에서 DB에 접속하려면, 해당 DB의 python 모듈이 설치되어 있어야 한다. 예) mysql용 : mySQl for python 모듈 (sourceforge.net에서 다운받는다) 1. 필요한 라이브러리 import from twisted.enterprise import adbapi from twisted.internet import reactor 2. DB에 접속하기 dbpool = adbapi.ConnectionPool('dbmodule', 'mydb', 'id', 'password')의 형식으로 기록한다. 따라서, 다음의 두 방법과 같이 접속 정보를 기록할 수 있다. 1) 방법 #1 dbpool = adbapi.ConnectionPool('MySQL..
mysql> select * into outfile '파일명' fields terminated by '구분자' from 테이블명
IE를 굳이 다시 설치하지 않더라도 오작동하는 경우, fix 하는 툴이 있다. 이 툴을 사용하면, 된다. 실행시켜서 [apply] 시키면, 익스플로러 파일을 찾는다. 이때, Windog CD를 넣거나, 첨부파일을 압축 풀고, 그 위치를 지정해주면 에러가 고쳐진다. 편리하다.!!
Optik (aka optarse) 를 사용하면, pytthon 애플리케이션 개발시 커맨드라인 옵션/ 파라미터를 파싱하기 쉬워진다. 예를 들어서, "실행파일명 --config 파일명" 으로 구성되는 형태의 옵션을 만들고 싶다면, 다음과 같이 간단하게 구성할 수 있다. from optik import OptionParser def main(): usage = "usage: %prog [options] arg" parser = OptionParser(usage) parser.add_option("-c", "--config", action="store", type="string", dest="filename" ) (options, args) = parser.parse_args() if options.filen..