네트워크를 사용해서 프로그래밍을 하다 보면 빼놓을 수 없는 부분이 이 MAC address이다. IP와 같이 쉽게 변경이 불가하고(ARP나 VM은 논외로 하자 자신의 NIC MAC 주소만 두고 보았을 때다.) 앞의 24bit를 이용해서 제조사까지 알아낼 수 있기 때문에, 많은 프로토콜에서 이 MAC Address를 사용한다. 이번 시간에는 getmac모듈과 함께 Python에서 MAC 주소를 알 수 있는 방법을 알아보자


1. Python에서 MAC 주소 가져오기 - GETMAC

getmac은 하나의 매소드만을 제공하는 Python 외장함수이다. >> pip3 install getmac으로 가져와야 한다.(3.X기준)

### getmac의 사용 ###
>>> import getmac

>>> getmac.get_mac_address()
'XX:XX:XX:XX:XX:XX'

간단한 내용이다. getmac의 구현부를 보면 다음과 같은 매서드 정의부를 확인할 수 있다.

def get_mac_address(
    interface=None, ip=None, ip6=None, hostname=None, network_request=True
):
    # type: (Optional[str], Optional[str], Optional[str], Optional[str], bool) -> Optional[str]
    """Get a Unicast IEEE 802 MAC-48 address from a local interface or remote host.

    You must only use one of the first four arguments. If none of the arguments
    are selected, the default network interface for the system will be used.

    Exceptions will be handled silently and returned as a None.
    For the time being, it assumes you are using Ethernet.

    NOTES:
    * You MUST provide str-typed arguments, REGARDLESS of Python version.
    * localhost/127.0.0.1 will always return '00:00:00:00:00:00'

    Args:
        interface (str): Name of a local network interface (e.g "Ethernet 3", "eth0", "ens32")
        ip (str): Canonical dotted decimal IPv4 address of a remote host (e.g 192.168.0.1)
        ip6 (str): Canonical shortened IPv6 address of a remote host (e.g ff02::1:ffe7:7f19)
        hostname (str): DNS hostname of a remote host (e.g "router1.mycorp.com", "localhost")
        network_request (bool): Send a UDP packet to a remote host to populate
        the ARP/NDP tables for IPv4/IPv6. The port this packet is sent to can
        be configured using the module variable `getmac.PORT`.
    Returns:
        Lowercase colon-separated MAC address, or None if one could not be
        found or there was an error.
    """

그니까 정리를 하면 NIC에 대한 이름과, mac주소를 가져올 단말기의 ipv4, v6 주소, DNS 호스트네임을 지정할 수 있다는 의미이다.

 

아래의 방법도 MAC Address를 가져오는데 많이 사용된다.

 

 

2. Python에서 MAC 주소 가져오기 - psutil

>>> import psutil
>>> nics = psutil.net_if_addrs()
### nics는 네트워크 정보를 가진 Dictionary가 된다. 보고 추출하면 된다.

psutil module은 프로세스 관리에 주로 사용된다. RAM이나, 스레드의 상태를 확인하고 변경하는데 특화되어있다. 그중 net_if_addr() 함수는 네트워크의 정보를 가져온다.

 

 

3. Python에서 MAC 주소 가져오기 - uuid

>>> import uuid
>>> a = uuid.getnode()
>>> mac = ':'.join(("%012X" % a)[i:i+2] for i in range(0, 12, 2))

사용할 일이 있을 때 퍼가면 좋을 거 같다. 

 

사실 백과사전이라 할 것까지는 없다. Python의 백과사전은 언제까지나 Github와 google일 것이다. pydoc은 Python document의 약자인데, Python에서 사용되는 Keyword, 내장 모듈 등의 설명서를 나타낸다. 크게 2가지 사용법을 알아보겠다.


사용법 - 1 Python 인터프리터로 해석 

필자는 Python개발도구로 IDLE을 보통 사용한다. IDLE에서 다음과 같은 코드를 입력하자

>>> import pydoc
>>> pydoc.help()

Welcome to Python 3.9's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at https://docs.python.org/3.9/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics".  Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help> 

pydoc에는 내장함수가 help하나 밖에 없다. help를 실행한 순간 help전용 대화형 인터프리터가 나온다. 예시로 yield 키워드를 help로 찾아보겠다.

help> yield
The "yield" statement
*********************

   yield_stmt ::= yield_expression

A "yield" statement is semantically equivalent to a yield expression.
The yield statement can be used to omit the parentheses that would
otherwise be required in the equivalent yield expression statement.
For example, the yield statements

   yield <expr>
   yield from <expr>

are equivalent to the yield expression statements

   (yield <expr>)
   (yield from <expr>)

Yield expressions and statements are only used when defining a
*generator* function, and are only used in the body of the generator
function.  Using yield in a function definition is sufficient to cause
that definition to create a generator function instead of a normal
function.

For full details of "yield" semantics, refer to the Yield expressions
section.

help> 

yield에 대한 사용법이 나온다. 리눅스 계열의 man명령어와 비슷하다고 볼 수 있겠다.  키워드 말고도 모듈도 검색할 수 있다.

help> pydoc
Help on module pydoc:

NAME
    pydoc - Generate Python documentation in HTML or text for interactive use.

MODULE REFERENCE
    https://docs.python.org/3.9/library/pydoc
    
    The following documentation is automatically generated from the Python
    source files.  It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations.  When in doubt, consult the module reference at the
    location listed above.

DESCRIPTION
    At the Python interactive prompt, calling help(thing) on a Python object
    documents the object, and calling help() starts up an interactive
    help session.
    
    Or, at the shell command line outside of Python:
    
    Run "pydoc <name>" to show documentation on something.  <name> may be
    the name of a function, module, package, or a dotted reference to a
    class or function within a module or module in a package.  If the
    argument contains a path segment delimiter (e.g. slash on Unix,
    backslash on Windows) it is treated as the path to a Python source file.
    
    Run "pydoc -k <keyword>" to search for a keyword in the synopsis lines
    of all available modules.
    
    Run "pydoc -n <hostname>" to start an HTTP server with the given
    hostname (default: localhost) on the local machine.
    
    Run "pydoc -p <port>" to start an HTTP server on the given port on the
    local machine.  Port number 0 can be used to get an arbitrary unused port.
    
    Run "pydoc -b" to start an HTTP server on an arbitrary unused port and
    open a Web browser to interactively browse documentation.  Combine with
    the -n and -p options to control the hostname and port used.
    
    Run "pydoc -w <name>" to write out the HTML documentation for a module
    to a file named "<name>.html".
    
    Module docs for core modules are assumed to be in
    
        https://docs.python.org/X.Y/library/
    
    This can be overridden by setting the PYTHONDOCS environment variable
    to a different URL or to a local directory containing the Library
    Reference Manual pages.

DATA
    __all__ = ['help']
    help = <pydoc.Helper instance>

DATE
    26 February 2001

AUTHOR
    Ka-Ping Yee <ping@lfw.org>

CREDITS
    Guido van Rossum, for an excellent programming language.
    Tommy Burnette, the original creator of manpy.
    Paul Prescod, for all his work on onlinehelp.
    Richard Chamberlain, for the first implementation of textdoc.

FILE

이런 식으로 말이다.

 

사용법 - 2 웹페이지를 사용

웹페이지를 호스팅 하여 pydoc을 활용할 수 있다. python 2.X에는 pydocgui라는 tkinter(python의 gui프로그래밍을 도와주는 모듈)로 제작된 별도의 모듈이 있었는데, 3.X 버전부터는 명령 프롬포트에 다음과 같은 명령으로 localhost에 웹페이지를 호스팅 한다.

C:\Users>python -m pydoc -p 12345

이렇게 하면 12345번 포트인 http://localhost:12345에 python documentation이 호스팅 된다. 내부는 이런 모습이다.


자! 이번 시간에는 python의 백과사전인 pydoc에 대해서 알아보았다. 물론 대부분의 경우 공식 API홈페이지나 Github의 형님들의 힘을 빌리겠지만, 네트워크가 안 되는 상황이나, 구글 신의 힘을 빌려도 잘 모르겠는 사용법은 같이 참고할 수 있으면 좋다. 

* 여담인데, pydoc에 문법에 맞추어 내가 추가한 모듈의 사용법을 추가할 수도 있다. 물론 pydoc은 로컬에 한정한다.

Python도 역시 여러 가지 웹 기능을 제공한다. socket과 같은 네트워킹 목적으로 python을 사용하는 사람도 있고, httplib나 requests처럼 특정 사이트와의 패킷 교환을 담당해 주는 라이브러리가 그 대표적인 예시라고 할 수 있겠다. 이번 시간에는 그중 조금 독특한, 네트워크를 컴퓨터 환경에 맞게 사용할 수 있게 해주는 webbrowser를 알아보자


목적

webbrowser 모듈은 웹 기반 문서를 사용자에게 표시할 수 있는 고수준 인터페이스를 제공합니다. 대부분은, 이 모듈의 open() 함수를 호출하면 올바른 작업이 수행됩니다.

- Python 공식 홈페이지 https://docs.python.org/ko/3/library/webbrowser.html -

간단하게 말하면, 내 컴퓨터 환경에 맞추어 웹 통신을 할 수 있게 해준다는 이야기이다.

다음의 코드를 따라 쳐보자

>>> import webbrowser
>>> webbrowser.open("www.google.com")
True

이러면 기본으로 지정된 브라우저로 www.google.com이 열린다. 

 

webbrowser의 제공함수

webbrowser는 다음과 같은 내 컴퓨터에 사용되는 웹 브라우저를 통한 웹 기능을 제공한다.

1. webbrowser.open(url, new=0, autoraise=True) : 웹브라우저로 url을 open한다.

 - url : open할 url

 - new : 1이면 가능한 새로운 브라우저가 open 2면 탭으로 추가됨

 - autoraise 가 True면 창이 올라간다.(최대화같은데 모르겠다. 변화가 없더라)

1-1. webbrowser.open_new(url) : webborowser.open(url,new=1)과 같다.

1-2. webbrowser.open_new_tab(url) : webbrowser.open(url,new=2)와 같다.

2. webbrowser.register(name, constructor, instance, *, preferred=False) : 기본으로 열릴 브라우저를 선택한다. 기본 브라우저는 아래 공식 API를 참조하기 바란다.

docs.python.org/ko/3/library/webbrowser.html

 

webbrowser — 편리한 웹 브라우저 제어기 — Python 3.9.4 문서

webbrowser — 편리한 웹 브라우저 제어기 소스 코드: Lib/webbrowser.py webbrowser 모듈은 웹 기반 문서를 사용자에게 표시할 수 있는 고수준 인터페이스를 제공합니다. 대부분은, 이 모듈의 open() 함수를

docs.python.org

 

제어기 객체

webbrowser는 브라우저를 열어줄 제어기(Controller) 객체를 이용할 수 있다.

### webbrowser와 소통할 수 있는 controller를 가져온다. 
### controller는 webbrowser가 제공하는 위의 기능을 모두 사용할 수 있다. 
>>> controller = webbrowser.get()

 

 

* 출처 : Python API Webbrowser docs.python.org/ko/3/library/webbrowser.html

 

webbrowser — 편리한 웹 브라우저 제어기 — Python 3.9.4 문서

webbrowser — 편리한 웹 브라우저 제어기 소스 코드: Lib/webbrowser.py webbrowser 모듈은 웹 기반 문서를 사용자에게 표시할 수 있는 고수준 인터페이스를 제공합니다. 대부분은, 이 모듈의 open() 함수를

docs.python.org


이번 모듈 탐구 시간에 처음으로 네트워크를 사용한 Python을 써본 거 같다. webbrowser가 사용되는 경우가 흔한 상황은 아닌데, 쓸 때 기억이 안 나면 짜증 나긴 한다.

정규표현식을 모르고 있는 사람은 아래 포스팅을 읽고 오자

2021.04.17 - [정보보안-이론] - 정규표현식에 대하여

 

정규표현식에 대하여

정규표현식은 여러 목적으로 사용된다. 정규표현식 자체는 어렵지 않다. 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. < 정규표현식의 정의 : 출

tutoreducto.tistory.com

필자도 정규표현식을 많이 안 써봤지만. Python도 정규표현식을 당연히 지원한다. re(Regular Expression)이라는 모듈을 알아보자.


Python에서 re사용법 

POSIX와 거의 동일하다. 아래는 Python에서 패턴문자가 의미하는 것이다.

패턴문자 설명
. New line을 제외한 모든 문자, 플래그중에 re.DOTALL이 있는데, 이게 설정되면 new line을 포함한 모든 문자가 된다.
^ 문자열의 처음에 일치하는 패턴, re.MULTILINE이 설정되면, 각라인마다 첫 패턴을 검색한다.
$ 문자열의 끝에 일치하는 패턴, re.MULTILINE이 설정되면, 각라인마다 첫 패턴을 검색한다.
* 해당하는 패턴의 0번이상 반복을 탐색 
+ 해당하는 패턴의 1번이상 반복을 탐색 
? 해당하는 패턴의 0번 혹은 1번 매칭을 탐색 
{m} 해당하는 패턴의 m번의 반복을 탐색
{m,n} 해당하는 패턴의 m번 이상 n번 이하 반복을 탐색
{m,n}? 해당하는 패턴의 m번 이상 n번 이하 반복중 최소길이 값을 탐색
\ 이스케이프 지시자
[] 대괄호안에들어간 문자중 하나를 선택
| 파이프기호, 좌변과 우변중하나를 선택

 

re객체의 사용

Python에서 정규표현식을 사용하기 위해서는 우선 정규표현식객체를 생성해야 된다. compile 명령을 다음과 같이 사용한다.

>>> import re
>>> re_object = re.compile("a{3}.*c$")

### re.compile(pattern)으로 사용한다.
### 위 패턴은 3번의 a반복과 0번이상의 아무문자 c로 끝나는 패턴들이다.

이렇게 생성이 된 re객체는 다음과 같은 식으로 사용될 수 있다.

 

match

>>> pat = re_object.match("aaaddc")
>>> pat
<re.Match object; span=(0, 6), match='aaaddc'>
### 문자열 aaaddc는 re_object의 패턴과 정합하니 pat을 생성한다.

>>> pat = re_object.match("a4aaddc")
>>> pat
None
### 문자열 a4aaddc는 re_object의 패턴과 정합하지 않으니, pat이 None이다.

 

match로 생성된 match객체는 다음과 같은 method를 가진다.

 match.group() : 정합된 문자열을 반환한다.
 match.start() : 정합된 문자열의 시작위치를 반환한다.
 match.end() : 정합된 문자열의 마지막위치를 반환한다.
 match.span() : 정합된 문자열 위치의 (시작, 끝)을 튜플로 반환한다.

 

* match객체를 아래처럼 바로 생성할 수 있다.

>>> re_object = re.match("(a{3}.)c$", "aaabbc")

 

search

>>> pat = re_object.search("123 aaaddc")
>>> pat
<re.Match object; span=(4, 10), match='aaaddc'>
### search는 패턴에 정합하는 문자열의 위치를 span(튜플임당)구조로 알려준다

 

findall

>>> re_object = re.compile("a{3}.c")
>>> pat = re_object.findall("aaabbc 123 aaaeec 123")
>>> print(pat)
["aaabbc", "aaaeec"]

### findall은 패턴에 부합되는 모든 결과를 list로 반환한다.
### 좋은 설명을 위해서 re_object를 다시 생성하였다.

 

finditer

>>> re_object = re.compile("a{3}.c")
>>> pat = re_object.finditer("aaabbc 123 aaaeec 123")
>>> pat
<callable_iterator object at 0x000001E22720F5E0>

### findall과 같은데, iterable한 객체를 반환한다. 객체는 하나하나가 match로 yield된다.

 

 

정규식 생성의 옵션

다음과 같은 옵션들이 있다. 

1. VERBOSE, X : 정규식을 여러 줄로 적고, 주석을 달아 세부적인 설명이 가능토록 해준다.

2. MULTILINE, M : 시작검색(^)이나 끝 검색($)이 여러 줄에(new line으로 구분되는) 각 줄에 해당되게 해 준다.

3. IGNORECASE, I : 대소문자 구별 없이 검색을 하게 해 준다.

4. DOTALL, S : 점(.)이 New Line을 포함해서 검색할 수 있게 해 준다.

 

 

* 출처 : Python API docs.python.org/3/library/re.html

 

re — Regular expression operations — Python 3.9.4 documentation

This module provides regular expression matching operations similar to those found in Perl. Both patterns and strings to be searched can be Unicode strings (str) as well as 8-bit strings (bytes). However, Unicode strings and 8-bit strings cannot be mixed:

docs.python.org


re모듈의 사용법에 대해 알아보았다. 정규표현식을 잘 사용하시는 분들의 것을 보면 무슨 암호문 같다. 사용법을 알고 능숙하게는 사용하지는 못하더라도, 읽을 수 있는 정도는 알아두자.

오랜만에 돌아온 모듈 탐구 시간이다. 이번 시간에는 일반 문자열 연산을 조금 더 편리하게 도와주는 string 모듈에 대해서 알아보자

 


제공하는 문자열

1. string.ascii_letters : 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

2. string.ascii_lowercase : 'abcdefghijklmnopqrstuvwxyz'

3. string.ascii_uppercase : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

4. string.digits : '0123456789'

5. string.hexdigits : '0123456789abcdefABCDEF'

6. string.octdigits :'01234567'

7. string.punctuation : '!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~'

8. string.printable : 출력 가능한 모든 문자열의 조합(ascii_letter + punctuation + digits)

9. string.whitespace : 공백으로 취급되는 모든 문자열(스페이스, 탭, 줄 바꿈, 캐리지 리턴, 세로 탭 및 폼 피드)

 

 

Formatter 클래스

Formatter은 문자열을 리터럴과 치환 필드(중괄호 {})로 표시를 한다. Formatter클래스는 str.format()과 유사하게 사용된다.

 

format 가장 기본적인 사용법은 다음과 같다.

 

>>> "tell me your {}".format("money")
tell me your money

 

 

중괄호 안에는 다음과 같은 문법을 써넣을 수 있으며, 의미는 옆 주석을 확인하면 된다.

"I love {}" ### 일반적인 치환문자{} "I love {0}"와 같은 의미이다.
"I love {} and {}" ### "I lovev {0} and {1}"와 같은 의미이다.
>>> 순서를 지정해줄 수 도 있고, 생략할 수도 있다.

"I have my name {name}" ### 키워드 name으로 지정값을 대입하게 할 수 있다.
"List number 1 is {my_list[0]}" ### my_list의 첫번째 원소값을 대입하게 한다
"Show me your money {0.my_money}" ### 0번째의 원소의 속성값 my_money를 출력하게 한다.
>>> 키워드를 통한 사용도 가능하며 나아가 자료구조의 속성이나 원소를 넣어줄 수 있다.

"I have much fun with {0!s}" ### 0번째 객체의 str()메소드를 호출한다.
"I have much fun with {0!r}" ### 0번째 객체의 repr()메소드를 호출한다.
"I have much fun with {0!a}" ### 0번째 객체의 ascii()메소드를 호출한다.
>>> 객체의 내장함수를 호출할 수 있다.

 

다양한 트릭을 다음처럼 사용할 수 있다.

### Trick 1. 텍스트 정렬
>>> "{:<30}".format("좌로밀착!")
'좌로밀착!                         '

>>> "{:>30}".format("우로밀착!")
'                         우로밀착!'

>>> "{:&^30}".format("가운데정렬!")
'&&&&&&&&&&&&가운데정렬!&&&&&&&&&&&&'


### Trick 2. 진법
>>> my_height = 185

>>> print("키가 어떻게 되세요?")
키가 어떻게 되세요?

>>> "10진수로 : {0:d} 16진수로 : {0:x} 8진수로 : {0:o} 2진수로 {0:b}".format(my_height)
'10진수로 : 185 16진수로 : b9 8진수로 : 271 2진수로 10111001'


### Trick 3. 구분자
>>> money = 100000000
>>> rate = 0.35

>>> "{0:,} {1:.2%}".format(money, rate)
'100,000,000 35.00%'

 

 

Template 클래스

Template 클래스는 대체 문자열 하나를 인자로 생성된다. 사용법이 직관적이니 다음의 코드를 확인하자.

### Template의 사용 ###
>>> my_template=string.Template("$abc is my $hobby")
>>> my_dict = {"abc":"riducto","hobby":"python"}
>>> your_dict = {"abc":"riducto"}

>>> my_template.substitute(my_dict)
'riducto is my python'
>>> my_template.substitute(your_dict)
Traceback (most recent call last):
...
KeyError: 'hobby'
### subsutitube는 템플릿에 지정된 $문자를 키로한 딕셔너리로 치환한다. key가 없을 경우 KeyError Exception

>>> my_template.safe_substitute(your_dict)
'riducto is my $hobby'
### 그런당신을 위해 safe_substitute는 지정문자를 치환에 실패한 경우 내비둔다.

 

* 출처 : docs.python.org/ko/3/library/string.html

 

string — 일반적인 문자열 연산 — Python 3.9.4 문서

string — 일반적인 문자열 연산 소스 코드: Lib/string.py 문자열 상수 이 모듈에 정의된 상수는 다음과 같습니다: string.ascii_letters 아래에 나오는 ascii_lowercase와 ascii_uppercase 상수를 이어붙인 것입니다

docs.python.org


이 정도면 string 모듈에 대해서는 다 설명한 거 같다. 다음 모듈 탐구 시간에 만나도록 하자!

sys모듈은 Python 인터프리터의 환경설정 등에 접근한다. 흔히 사용하는 sys.modules 나 sys.path 뿐만이 아니라 더욱 폭넓은 기능과 정보들을 가지고 있으니, 이번 시간을 통해서 자세히 알아보도록 하자


sys에서 제공하는 정보

1. sys.argv : Python 스크립트에 전달된 명령 줄의 인자를 LIST형태로 전달한다. 스크립트 이름은 sys.argv[0]를 가지고 뒤에 전달이 되면 순서대로 sys.argv [1], [2]가 된다. 만약 실행형 옵션인 -c를 설정하면 sys.argv [0]는 "-c"가 된다.

2. sys.byteorder : 현재의 바이트표기법이 little인지 big인지를 표시한다.

3. sys.builtin_module_names : 현재 Python 인터프리터로 가져온 모든 모듈의 이름을 제공하는 문자열을 튜플로 반환한다.

4. sys.copyright : Python Interpreter의 저작권을 문자열로 반환한다.

5. sys.dont_write_bytecode : 이게 True면 모듈 import 시. pyc를 만들지 않는다.

6. sys.pycache_prefix : 이게 설정되면(디렉터리 문자열로 설정)  __pycache__에 pyc가 생성되는 것이 아니라, 같은 디렉터리 문자열에 pyc가 생성이 된다.

7. sys.float_info : 실수는 운영환경에 따라 표현의 깊이 달라진다. 그 표현 깊이를 반환한다.

8. sys.hash_info : 해시 알고리즘을 계산하는 머신의 정보를 튜플로 반환한다.

9. sys.int_info : 정수 표현의 수준을 튜플로 반환한다.

10. sys.maxunicode : 가장 큰 유니코드의 코드 값을 반환한다.

11. sys.modules : 이미 로드된 모듈을 저장한 Dictionary이다. API에서는 modules Dictionary를 직접 바꾸는 것은 추천하지 않는다.

12. sys.path : 모듈이 탐색될 수 있는 경로를 가진 LIST이다. sys.path에 경로가 추가되면, 그 위치에서 모듈을 절대 경로를 생략하고 import 할 수 있다.

13. sys.platform : Python이 실행되는 플랫폼을 문자열로 반환한다.

14. sys.thread_info : 스레드 구현에 관련된 정보를 담은 Tuple

15. sys.version : Python 인터프리터의 버전 번호와 빌드 번호 등을 포함한 문자열, 유사한 기능으로 sys.api_version, sys.version_info, sys.winver

 

 

sys에서 제공하는 함수

1. sys.exit([args]) : SystemExit이라는 Exception을 발생시켜 Python에서 빠져나온다. 따라서 이를 try - except으로 예외 처리하면 Python은 종료되지 않는다.

2. sys.getallocatedblocks() : 현재 Pythond이 메모리에서 차지한 공간을 출력한다. 메모리 Leak 등을 검사하는 데 사용된다.

3. sys.getdefaultencoding() : 현재 기본 문자열 인코딩 타입을 반환한다.

4. sys.getrecursionlimit() : 스택의 재귀 깊이를 반환한다. setrecursionlimit(int)로 설정할 수도 있다.

5. sys.getsizeof(object) : 객체의 크기를 바이트 단위로 반환한다. 객체가 참조하는 다른 객체의 크기를 포함하지 느 않는다.

6. sys.intern(String) : String을 메모리 사전에 등록한다. 이는 성능 최적화를 위한 것으로, 만약 'ABC"라는 문자열이 intern으로 등록되면, a="ABC', b="ABC"라고할 때 a와 b는 같은 메모리 위치를 가진다.

7. sys.is_finalizing() : Python이 종료 중이면 True, 아니면 False를 반환한다.

 

 

표준 스트림

1. sys.stdin : 표준 입력 스트림(객체다)

2. sys.stdout : 표준 출력 스트림(객체다)

3. sys.stderr : 표준 에러 스트림(객체다)

 

* 출처 : docs.python.org/ko/3/library/sys.html

 

sys — 시스템 특정 파라미터와 함수 — Python 3.9.4 문서

sys — 시스템 특정 파라미터와 함수 이 모듈은 인터프리터에 의해 사용되거나 유지되는 일부 변수와 인터프리터와 강하게 상호 작용하는 함수에 대한 액세스를 제공합니다. 항상 사용 가능합니

docs.python.org


이번 시간에는 Python인터프리터와 실행환경에 관련된 sys에 관하여 조금 깊게 알아보았다. 위에 기술된 정보나 함수 외에도 저수준의 제공 기능(함수의 breakpoint, hook, audit 등)을 또한 제공하니, API를 읽어보는 것을 추천한다.

+ Recent posts