sys 모듈

sys 모듈

  • sys 모듈은 파이썬 인터프리터와 관련된 정보와 기능을 제공하는 모듈이다.

sys.argv

  • sys.argv는 파이썬 스크립트로 넘어온 인자의 리스트이다.

  • 0번째에는 스크립트 이름이 있으며, 그 이후부터 인자가 설정된다.


# python /Users/gy8971/Desktop/gid/1.Programming/Python/init.py test 실행시켰을 때

import sys

print("argv size : ", len(sys.argv))
for i, arg in enumerate(sys.argv):
    print(i, arg)



argv size :  2
0 /Users/gy8971/Desktop/gid/1.Programming/Python/init.py
1 test

sys.exc_info()

  • sys.exc_info()는 현재 발생한 예외 정보를 튜플로 반환한다.

  • 예외가 없는 경우에는 None을 반환한다.

import sys


print(sys.exc_info())


try:
    1/0
except:
    exc_class, val, tb_ob = sys.exc_info()
    print(exc_class)
    print(val)
    print(tb_ob)
    print(dir(tb_ob))
    print(tb_ob.tb_lineno)



    (None, None, None)
<class 'ZeroDivisionError'>
division by zero
<traceback object at 0x103963bc8>
['tb_frame', 'tb_lasti', 'tb_lineno', 'tb_next']
11

sys.prefix, sys.exec_prefix, sys.executable

  • sys.prefix, sys.exec_prefix, sys.executable은 파이썬이 설치된 경로와 실행 파일을 나타낸다.
import sys


print(sys.prefix)           # 파이썬이 설치된 경로
print(sys.exec_prefix)
print(sys.executable)       # 파이썬 인터프리터의 실행파일 경로


/Library/Frameworks/Python.framework/Versions/3.6
/Library/Frameworks/Python.framework/Versions/3.6
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3

sys.exit([arg])

  • sys.exit([arg])은 프로세스를 종료 시킨다.

  • arg가 0인 경우는 정상 종료, 0이 아닌 경우에는 비정상 종료로 처리된다.


sys.copyright, sys.version

  • sys.copyright, sys.version은 설치된 파이썬의 저작권과 버전을 나타낸다.
import sys



print(sys.copyright)
print("===")
print(sys.version)
print("===")
print(sys.version_info)



Copyright (c) 2001-2017 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.
===
3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
===
sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)

sys.getdefaultencoding()

  • sys.getdefaultencoding()은 현재 사용 중인 기본 문자열 인코딩을 반환한다.
import sys



print(sys.getdefaultencoding())



utf-8

threading 모듈

  • 쓰레드란 하나의 프로세스 내에서 진행되는 하나의 실행 단위를 뜻한다.

  • 하나의 프로세스에서 여러 실행 단위가 실행되는 것을 멀티 쓰레드라 한다.

  • 프로세스쓰레드는 모두 프로그램을 수행한다는 공통점을 지니고 있지만,
    프로세스는 윈도우에서 여러 응용프로그램을 각각 실행시키는 것처럼 독립적으로 실행되어 독립된 메모리 공간을 사용하지만,
    멀티쓰레드하나의 프로세스내에서 여러 쓰레드가 프로세스 공간의 메모리공유해서 사용할 수 있다.


Thread.start()

  • 쓰레드를 시작할 때 사용한다.

Thread.run()

  • 쓰레드의 주요 동작을 정의한다.

Thread.join([timeout])

  • 쓰레드가 종료되기를 기다린다. [timeout]이 정의된 경우, 최대 정의된 시간만큼 기다린다.

Lock 객체

  • 하나의 프로세스에서 2개 이상의 쓰레드가 동시에 수행되는 경우, 쓰레드 간에 프로세스 공간의 메모리를 공유한다.

  • 만약 하나의 변수에 대해서 2개 이상의 쓰레드가 변경을 가하고자 한다면, 어떤 쓰레드가 먼저 수행되느냐에 따라 결과가 달라질 수 있다.

  • 이러한 상태를 경쟁 상태(Race condition)라고 한다.

  • 이러한 상황을 방지하기 위해서 파이썬에서는 Lock이라는 동기화 객체를 지원한다.

Lock객체는 locked와 unlocked의 2가지 상태를 가지며,

acquire()와 release()의 두 가지 함수만을 제공한다.

unlocked 상태에서 acquire()가 호출되면 locked 상태로 바뀌며,

locked 상태에서 release()가 호출되면 unlocked 상태로 바뀌게 된다.

locked 상태에서 다른 쓰레드가 acquire()를 호출하면

locked 상태의 쓰레드가 release()할 때까지 멈추게 된다.

다음 예제코드는 threading의 Thread와 Lock 객체를 이용해

각각 버그를 수정하는 시뮬레이션 프로그램이다.

전역 변수로 총 버그 개수를 정의해 놓고,

생성된 3개의 developer 쓰레드가

각각 0.1초에 하나씩 버그를 해결해 나가게 된다.

버그 개수가 0이 되어 모든 쓰레드가 종료되면 각자 몇 개씩

버그를 해결했는지를 출력한다.

from threading import Thread, Lock
# import thread
# import lock
import time

count = 10
lock = Lock()

class developer(Thread):
    def __init__(self,name):            # 초기화
        Thread.__init__(self)
        self.name = name
        self.fixed = 0

    def run(self):                      # 쓰레드 동작 정의
        global count
        while 1:
            lock.acquire()              # lock
            if count > 0 :
                count -= 1
                lock.release()          # unlock
                self.fixed += 1
                time.sleep(0.1)
            else :
                lock.release()          # unlock
                break


dev_list = []
for name in ['Shin', 'Woo', 'Choi']:
    dev = developer(name)               # thread 생성
    dev_list.append(dev)
    dev.start()                         # thread 시작
    

for dev in dev_list:
    dev.join()                          # wait
    print(dev.name, 'fixed', dev.fixed)




# 실행할 때마다 결과가 달라진다.

Shin fixed 3
Woo fixed 3
Choi fixed 4