레이블이 signal인 게시물을 표시합니다. 모든 게시물 표시
레이블이 signal인 게시물을 표시합니다. 모든 게시물 표시

python function timeout decorator

it's function's timeout decorator on python



 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
32
33
34
35
36
37
38
39
40
41
42
43
44
from functools import wraps
import time
import signal
import errno

class TimeoutError(Exception):
    pass

def funcTimeout(timeout=30):
        def decorator(func):

                def handleFuncTimeout(signum, frame):
                        raise TimeoutError(os.strerror(errno.ETIME))

                @wraps(func)
                def wrapper(*args, **kwargs):
                        #print '[%d]wrapper START' % id
                        sTime = time.time()

                        signal.signal(signal.SIGALRM, handleFuncTimeout)
                        signal.alarm(timeout)

                        try:
                                result = func(*args, **kwargs)
                        finally:
                                signal.alarm(0)

                        #print '[%d]wrapper END(elapseTime=%d)' % (id, time.time()-sTime)

                        return result

                return wrapper

        return decorator


#DIRECTIONS
@funcTimeout(3)
def func():
    print 'func() start'
    time.sleep(5)
    print 'func() end'

func()

QT designer와 PySide연동하기

QT designer와 PySide를 연동하여 시그널 매핑까지 하는 샘플코드이다.

ui 파일을 불러와 시그널까지 매핑하는 부분을 참고할 수 있는 사이트가 별로 없어

상당히 많이 헤맸다.

# -*- coding: utf-8 -*-
import sys
from PySide import QtCore
from PySide import QtGui
from PySide import QtUiTools # QT designer의 UI파일을 로드할 수 있게 해주는 라이브러리

class Dialog(QtGui.QDialog):
  def __init__(self, parent=None):
    super(PosSimDialog, self).__init__(parent)
    loader = QtUiTools.QUiLoader();
    file = QtCore.QFile("pos.ui")
    file.open(QtCore.QFile.ReadOnly)
    self.ui = loader.load(file, self)
    file.close()

    # mapping signal
    self.ui.btn_ok.clicked.connect(self.ok) # 디자이너에 btn_ok인 버튼이 클릭시 실행될 메소드를 ok()로 지정한다.

  def show(self):
    self.ui.show()
    self.ui.open()

  def ok(self): # btn_ok버튼 클릭시 실행될 코드 부분
    pass

if __name__ == "__main__":
  app = QtGui.QApplication(sys.argv)
  dlg = Dialog()
  dlg.show()
  app.exec_()