파이썬(python) – 표준모듈 사용하기 [첫번째] : os, sys 모듈

이번 시간부터는 앞으로 python 을 사용하시면서 가장 많이 import 하게 될 모듈들을 차례대로 살펴보겠습니다.
언급하는 모듈들에 어떤 기능들이 숨겨져있나를 보시려면 import module_name 하시고 dir(module_name)로 확인하시면 됩니다.

(1) os 모듈 : os 에서 제공하는 기본적인 기능들을 묶어놓은 것

# os 모듈 import
>>> import os                                       

# 현재 working directory 가져오기
>>> os.getcwd()
'/home/dplee/tmp'

# 내 process id 가져오기
>>> os.getpid()
1915

# current working directory 를 변경
>>> os.chdir('/home/dplee')                       

# working directory 확인
>>> os.getcwd()
'/home/dplee'

# os.path 라고 쳐보니 모듈이라고 나오네요.
>>> os.path
<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'>

# 모듈은 또한 기능의 집합이죠.
>>> dir(os.path)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_resolve_link', '_varprog', 'abspath', 'altsep', 'basename', 'commonprefix', 'curdir', 'defpath', 'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', 'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', 'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', 'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', 'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', 'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'stat', 'supports_unicode_filenames', 'sys', 'walk', 'warnings']

# 인자로 주어지는 이름이 directory 인가 ?
>>> os.path.isdir('.')
True

# directory 변경
>>> os.chdir('work')                              

# 현재 directory 의 directory list 를 보여줌
>>> os.listdir('.')
['exercise_cpp', 'etc', 'picomem', 'hack', 'python_study']

os 모듈은 파일, 프로세스 등과 관련되어 os 에서 제공하는 기능들을 모두 망라한 모듈입니다. 가장 사용할 일이 많죠.
그런데, 위의 테스트 과정을 보니 os.path 라는 모듈이 또 있네요 ?
즉, os 라는 모듈안에 path 라는 모듈이 또 들어있군요.
이렇게 모듈안에 또 다른 모듈이 포함될 수도 있다는 것을 알아두시기 바랍니다.
아래에서 살펴볼 sys 모듈도 사실은 os 모듈안에 포함되어 있습니다.
못믿으시겠다면 확인해볼까요 ?
먼저 아래와 같이 dir 을 통해 os 에서 나오는 리스트를 확인해 보세요. 혹시 sys 라는 이름이 나오지 않나요 ? 그리고, help(os.sys)라고 쳐보면 build-in module 이라고 나올 것입니다.

>>> import os
>>> import sys
>>> dir(os)
>>> help(os.sys)

아래 것도 수행해보세요. sys 와 os.sys 가 같다는 확인사살이죠. ^^

>>> sys is os.sys
True

(2) sys 모듈 : python interpreter 와 관련된 정보와 기능을 제공

sys 모듈에서 가장 많이 사용하는 예를 몇가지만 보여드리겠습니다.

>>> import sys

# 명령어 라인 인자 (command line arguments) 리스트
>>> print sys.argv
['test.py', 'one']

# 표준출력(stderr) 로 에러 찍기
>>> sys.stderr.write('my errorn')
my error

# 프로그램 빠져나가기
>>> sys.exit()     

# 현재 로딩되어 있는 모듈을 dictionary 로 보여줌                                
>>> sys.modules                                
{'tokenize': <module 'tokenize' from '/usr/lib/python2.7/tokenize.pyc'>, 'heapq': <module 'heapq' from '/usr/lib/python2.7/heapq.pyc'>, 'copy_reg': <module 'copy_reg' from '/usr/lib/python2.7/copy_reg.pyc'>, 'sre_compile': <module 'sre_compile' from '/usr/lib/python2.7/sre_compile.pyc'>.... 생략

# 현재 환경변수 PATH 잡혀있는 directory list 확인
>>> sys.path                                      
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2',... 생략]

특히 sys.argv 를 많이 사용하는데 c 나 c++ 처럼 인자하나하나를 접근하고 싶을 때는 sys.argv[0], sys.argv[1] 과 같이 사용하시면 됩니다.
그리고, 표준출력 관련하여 stderr 대신에 stdin, stdout 을 사용하실 수 있습니다.

이제 위에서 배운 것들을 살짝 이용하여 프로그램을 하나 작성해볼까요 ?
interpreter 상에서 수행할 수 있는 명령어는 모두 파일로도 작성 가능하니 프로그램을 짜기가 쉽습니다.

import os
import sys

def list(dir):
    filenames = os.listdir(dir)
    for filename in filenames:
        path = os.path.join(dir, filename)
        print path
        print os.path.abspath(path)

def main():
    list(sys.argv[1])

if __name__ == '__main__':
    main()

위의 코드를 한줄한줄 해석한 후 한번 실행해보세요. python file.py dir_name 과 같이 실행하면 됩니다.

다음 시간에는 또 다른 유용한 모듈들을 계속해서 배워보겠습니다.

You may also like...

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x