13. Utility Scripting and System Administration

13.1. Accepting Script Input via Redirection, Pipes, or Input Files

P : 스크립트 입력을 여러 가지로 유연하게 받고 싶다.

S : fileinput 모듈을 쓴다.

#!/usr/bin/env python3
import fileinput

with fileinput.input() as f_input:
    for line in f_input:
        print(line, end='')

13.2. Terminating a Program with an Error Message

P : 프로그램 종료 시 에러 메시지를 띄우고 싶다.

S : SystemExit 예외를 쓴다.

raise SystemExit('It failed!')

13.3. Parsing Command-Line Options

P : 커맨드 라인 옵션을 파싱하고 싶다.

S : argparse 모듈을 쓴다.

# search.py
'''
Hypothetical command-line tool for searching a collection of
files for one or more text patterns.
'''
import argparse
parser = argparse.ArgumentParser(description='Search some files')

parser.add_argument(dest='filenames',metavar='filename', nargs='*')

parser.add_argument('-p', '--pat',metavar='pattern', required=True,
                    dest='patterns', action='append',
                    help='text pattern to search for')

parser.add_argument('-v', dest='verbose', action='store_true',
                    help='verbose mode')

parser.add_argument('-o', dest='outfile', action='store',
                    help='output file')

parser.add_argument('--speed', dest='speed', action='store',
                    choices={'slow','fast'}, default='slow',
                    help='search speed')

args = parser.parse_args()

# Output the collected arguments
print(args.filenames)
print(args.patterns)
print(args.verbose)
print(args.outfile)
print(args.speed)

13.4. Prompting for a Password at Runtime

P : 패스워드가 필요한 스크립트의 패스워드를 런타임에 지정시키고 싶다.

S : getpass 모듈을 사용한다.

import getpass

user = getpass.getuser()
passwd = getpass.getpass()

if svc_login(user, passwd):    # You must write svc_login()
   print('Yay!')
else:
   print('Boo!')

13.5. Getting the Terminal Size

P : 터미널 사이즈를 알고 싶다.

S : os.get_terminal_size()를 쓴다.

>>> import os
>>> sz = os.get_terminal_size()
>>> sz
os.terminal_size(columns=80, lines=24)
>>> sz.columns
80
>>> sz.lines
24
>>>

13.6. Executing an External Command and Getting Its Output

P : 외부 커맨드를 실행하고 그 출력을 얻고 싶다.

S : subprocess.check_output()을 쓴다.

import subprocess
out_bytes = subprocess.check_output(['netstat','-a'])

13.7. Copying or Moving Files and Directories

P : 파일이나 디렉토리를 복사/이동하고 싶다.

S : shutil 모듈을 쓴다.

import shutil

# Copy src to dst. (cp src dst)
shutil.copy(src, dst)

# Copy files, but preserve metadata (cp -p src dst)
shutil.copy2(src, dst)

# Copy directory tree (cp -R src dst)
shutil.copytree(src, dst)

# Move src to dst (mv src dst)
shutil.move(src, dst)

13.8. Creating and Unpacking Archives

P : 압축 파일을 생성/해제하고 싶다.

S : shutil 모듈을 쓴다.

>>> import shutil
>>> shutil.unpack_archive('Python-3.3.0.tgz')
>>> shutil.make_archive('py33','zip','Python-3.3.0')
'/Users/beazley/Downloads/py33.zip'
>>>

13.9. Finding Files by Name

P : 파일을 이름으로 검색하고 싶다.

S : os.walk()를 쓴다.

#!/usr/bin/env python3.3
import os

def findfile(start, name):
    for relpath, dirs, files in os.walk(start):
        if name in files:
            full_path = os.path.join(start, relpath, name)
            print(os.path.normpath(os.path.abspath(full_path)))

if __name__ == '__main__':
    findfile(sys.argv[1], sys.argv[2])

13.10. Reading Configuration Files

P : 설정 파일을 읽어들이고 싶다.

S : configparser 모듈을 쓴다.

>>> from configparser import ConfigParser
>>> cfg = ConfigParser()
>>> cfg.read('config.ini')
['config.ini']
>>> cfg.sections()
['installation', 'debug', 'server']
>>> cfg.get('installation','library')
'/usr/local/lib'
>>> cfg.getboolean('debug','log_errors')
True
>>> cfg.getint('server','port')
8080
>>> cfg.getint('server','nworkers')
32
>>> print(cfg.get('server','signature'))

=================================
Brought to you by the Python Cookbook
=================================
>>>

13.11. Adding Logging to Simple Scripts

P : 로깅을 추가하고 싶다.

S : logging 모듈을 쓴다.

import logging

def main():
    # Configure the logging system
    logging.basicConfig(
        filename='app.log',
        level=logging.ERROR
    )

    # Variables (to make the calls that follow work)
    hostname = 'www.python.org'
    item = 'spam'
    filename = 'data.csv'
    mode = 'r'

    # Example logging calls (insert into your program)
    logging.critical('Host %s unknown', hostname)
    logging.error("Couldn't find %r", item)
    logging.warning('Feature is deprecated')
    logging.info('Opening file %r, mode=%r', filename, mode)
    logging.debug('Got here')

if __name__ == '__main__':
    main()

13.12. Adding Logging to Libraries

P : 라이브러리에 로깅을 추가하고 싶다.

S : 역시 logging을 쓴다.

# somelib.py

import logging
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler())

# Example function (for testing)
def func():
    log.critical('A Critical Error!')
    log.debug('A debug message')

>>> import logging
>>> logging.basicConfig()
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
>>>

13.13. Making a Stopwatch Timer

P : 스톱워치 타이머를 만들고 싶다.

S : time 모듈을 쓴다.

import time

class Timer:
    def __init__(self, func=time.perf_counter):
        self.elapsed = 0.0
        self._func = func
        self._start = None

    def start(self):
        if self._start is not None:
            raise RuntimeError('Already started')
        self._start = self._func()

    def stop(self):
        if self._start is None:
            raise RuntimeError('Not started')
        end = self._func()
        self.elapsed += end - self._start
        self._start = None

    def reset(self):
        self.elapsed = 0.0

    @property
    def running(self):
        return self._start is not None

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, *args):
        self.stop()

13.14. Putting Limits on Memory and CPU Usage

P : CPU/메모리 사용량에 제한을 두고 싶다.

S : resource 모듈을 쓴다.

import signal
import resource
import os

def time_exceeded(signo, frame):
    print("Time's up!")
    raise SystemExit(1)

def set_max_runtime(seconds):
    # Install the signal handler and set a resource limit
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
    signal.signal(signal.SIGXCPU, time_exceeded)

if __name__ == '__main__':
    set_max_runtime(15)
    while True:
        pass

13.15. Launching a Web Browser

P : 웹 브라우저를 실행시키고 싶다.

S : webbrowser 모듈을 사용한다.

>>> import webbrowser
>>> webbrowser.open('http://www.python.org')
True
>>>

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중