Chapter 4. import 명령과 sys, clr 모듈

Python은 단독으로는 사용하기에는 그 기능이 너무 빈약합니다. 하지만 다른 구현과 다른 모듈들이 결합되는 그 시점부터 Python의 기능은 매우 막강해집니다. 특히 IronPython의 경우 그렇습니다.

IronPython에서는 내장 라이브러리는 물론 다른 외부 Python 모듈이나 .NET Framework의 클래스 라이브러리 등을 import 명령으로 가져올 수 있습니다.


import sys

위의 명령을 입력하면 sys 모듈을 사용할 수 있는 상태로 준비하는 것입니다. 위와 같이 입력한 다음에 아래처럼 입력해봅시다.


print sys.getrecursionlimit()

함수 이름에서도 알 수 있듯이 위에서 제공하는 기본 함수는 IronPython이 수용할 수 있는 범위에서의 재귀 함수 호출 가능 깊이입니다. 사소한 것일 수 있지만 위와 같은 시스템 정보 관련 함수들은 IronPython을 비롯한 다양한 Python 인터프리터가 일반적인 Intel Processor 기반의 PC가 아닌 다른 PC나 장비에서 사용이 가능하기 때문에 매우 중요합니다. 즉, 어떤 면에서는 Java나 .NET보다 더 범용성이 좋은 것입니다.

sys 모듈을 통하여 알아볼 수 있는 정보들은 이외에도 매우 많습니다. 계속 살펴보도록 하죠.


# 기본 인코딩을 조사 (IronPython은 .NET Framework 개체명을 리턴할 것입니다.)

print sys.DefaultEncoding

# C API Version 조사 (IronPython에서는 안내 메시지가 대신 출력되며, CPython에서는 정확한 버전 정보가 출력됩니다.)

print sys.api_version

# 프로그램에 전달된 명령줄들이 나타납니다. 현재 버전에서는 ipy에 다른 인수를 지정할 수 없습니다. (이후에 ipy가 아닌 다른 프로그램에서 IronPython을 사용하는것이라면 가능합니다.)

print sys.argv

# 시스템이 Little Endian 체제인지 Big Endian 체제인지를 확인합니다. 요즈음 Windows 운영 체제라면 Little Endian이라고 볼 수 있겠습니다.

print sys.byteorder

# IronPython의 저작권 정보입니다.

print sys.copyright

# 다중 콘솔을 지원하는 유닉스나 리눅스와 같은 환경에서의 사용을 고려한 것으로 보이며, Windows 시스템을 기반으로 하는 IronPython의 경우 사용할 수 없습니다. (다만 메시지가 대신 출력됩니다.)

print sys.displayhook

# 마찬가지로 사용할 수 없는 정보입니다.

print sys.excepthook

# 현재 프로그램이 실행된 경로를 출력합니다. IronPython 인터프리터에서 조회하면 IronPython이 설치된 경로가 대신 나타날 것입니다.

print sys.exec_prefix

# 현재 프로그램의 실제 경로를 출력합니다. 물론 이것 역시도 IronPython 인터프리터를 통한 것이라면 인터프리터의 기준에 맞추어갑니다.

print sys.executable

# Ctrl+Z 키를 통하지 않고 종료할 수 있는 또 다른 방법은 이 함수를 호출하는 것입니다.

sys.exit()

# IronPython의 소스 코드를 한 번 살펴봐야 하겠지만 지금 이 함수는 한 가지 재미있는 예외를 발생시키는데, IronPython 내부적으로 Mark & Sweep 가비지 컬렉터를 사용한다는 이야기가 나옵니다.

o = object()
print sys.getrefcount(o)

# 아래의 필드에 관해서는 좀 더 조사해보고 A/S 해드리겠습니다.

print sys.hexversion

# 최대 범위의 정수를 조사하기 위해 사용합니다.

print sys.maxint

# 최대 범위의 유니코드 범위를 조사하기 위해 사용합니다. (Char 형 타입과 아마 관련이 있을것입니다.)

print sys.maxunicode

# 기본으로 로딩되는 모듈들의 목록을 조사합니다.

print sys.modules

# IronPython이 자동으로 검색하는 경로들의 목록을 조사합니다. Windows NT의 환경 변수의 하나인 %PATH%와는 관련성이 없습니다.

print sys.path

# IronPython의 플랫폼 정보를 출력합니다. .NET Framework를 기반으로 하고 있으므로 “cli”가 반환될 것입니다. Mono의 경우는 아직 체크해보지 못했습니다. 왜 CLI인지는 아시겠지요? Common Language Infrastructure의 약어이고 이것이 .NET Framework를 지칭하기 때문입니다.

print sys.platform

# exec_prefix와 유사한 것으로 보입니다. 구체적인 내용 역시 이후에 A/S 해드리도록 하겠습니다.

print sys.prefix

# 기본 프롬프트의 모양을 가져오거나 설정할 수 있습니다. 이것은 IronPython 인터프리터에 한정되는 내용일 것입니다.

print sys.ps1
sys.ps1 = ‘철뱀> ‘
sys.ps1 = ‘>>> ‘

# 여러줄 입력 모드 프롬프트의 모양을 가져오거나 설정할 수 있습니다. 역시 IronPython 인터프리터에 한정됩니다.

print sys.ps2
sys.ps2 = ‘철뱀2> ‘
sys.ps2 = ‘… ‘

# 표준 파일 핸들에 쉽게 접근할 수 있도록 고안된 것이며 지금의 것은 표준 오류 스트림입니다. 아래 예제는 오류 스트림에 한 줄의 문자열을 출력합니다.

sys.stderr.write(‘testn’)

# 표준 파일 핸들에 쉽게 접근할 수 있도록 고안된 것이며 지금의 것은 표준 입력 스트림입니다. 아래 예제는 입력 스트림으로부터 한 줄의 문자열을 읽습니다.

sys.stdin.readline()

# 표준 파일 핸들에 쉽게 접근할 수 있도록 고안된 것이며 지금의 것은 표준 출력 스트림입니다. 아래 예제는 출력 스트림에 한 줄의 문자열을 출력합니다.

sys.stdout.write(‘test2n’)

# IronPython의 버전 정보를 문자열로 확인합니다.

print sys.version

# IronPython의 버전 정보를 객체로 확인합니다.

print sys.version_info

각각의 예제는 한 번씩 살펴보시면 되겠습니다. 그리고 IronPython이 진정으로 의미있는 부분은 역시 .NET Framework 기반이며 자유롭게 .NET Framework를 이용할 수 있어야 한다는 점이 되겠지요. 그래서 IronPython만의 모듈이 하나 더 있는데 바로 clr 모듈입니다.


import clr

위의 모듈을 로드한 상태에서 즉시 WIndows Forms 객체를 하나 만들어보도록 합니다.


clr.AddReference(“System.Windows.Forms”)
import System.Windows.Forms
from System.Windows.Forms import Form
o = System.Windows.Forms.Form()
o.Text = ‘Hello world in Python!’
o.ShowDialog()

하나씩 분석해보도록 하겠습니다. 우리가 방금전에 로드한 clr 모듈의 멤버 함수인 AddReference 함수를 호출하여 GAC에 장착된 System.Windows.Forms 어셈블리를 추가하였습니다. 그러고는 곧장 import 명령으로 다시 System.Windows.Forms 네임스페이스를 가져왔습니다.

여기서 착각하지 말아야 할 것은, import 명령어가 C#의 using이나 Visual Basic .NET의 Imports와 같지 않다는 점입니다. 다만 단독으로 import를 사용하는 것은 이러한 네임스페이스나 모듈의 사용을 준비하는 것을 지시하는 정도입니다.

그 다음줄을 살펴봐야 하는데, 바로 from ~ import 절입니다. from 다음에는 import로 가져올 메서드, 변수, 형식이 들어있는 네임스페이스나 모듈을 지정하고 import에서는 해당하는 이름을 넣어줍니다. 만약 해당 모듈 안의 모든것을 가져오려면 Asterisk (*) 기호를 넣으면 됩니다. 하지만 IronPython의 동작 특성이 인터프리터 기반이라는 것을 감안할 때 형식 수가 많은 .NET Framework Assembly의 모듈들에 대해서는 별로 적절하지 않을 것입니다. 그러므로 위에서와 같이 Form 형식만을 우선 가져옵니다.

이제 준비는 끝났고 실제로 객체를 생성해봅니다. IronPython이 인터프리터 방식이라는 것을 아직 잊지 않았다면 변수 선언 하는 것을 보고 놀라시면 안되겠지요. 즉, Late-Binding 스타일입니다. 스크립팅 언어의 생명력은 바로 여기에 있는것이지요. 참고로, 해묵은 성능 문제와 스크립팅 언어의 단점을 지적하는 것은 이 강의의 주제와도 맞지 않는 질문일 뿐더러 강의 주제를 잘못 고르신 것입니다. 이런 질문은 하지 말아주세요.

본론으로 돌아와서 o라는 변수에 Form 클래스의 생성자를 호출했습니다. 생성자를 호출하는 방법이 참 심플합니다. 생성자도 함수처럼 사용이 가능하지요.

이제 생성된 객체의 프로퍼티에 뭔가 값을 써 넣어보도록 합니다. Text 속성에 문자열을 집어넣었습니다. Form 클래스의 경우 Text 속성에 들어가는 것이 창의 제목 표시줄에 찍힐 문자열이 됩니다.

자, 이제 대충 의도한대로 되었으니 화면에 띄워보아야 겠습니다. ShowDialog 메서드를 호출하면 될 것입니다. 이렇게 구동하면 Modal 상태로 Dialog가 나타날 것입니다.

하지만 Show 메서드나 Visible 프로퍼티로 창을 띄우게 되면 적절한 메시지 루프가 형성되지 않기 때문에 창이 곧 얼어버리고 맙니다. 그렇긴 해도 인터프리터는 살아있겠지요. 이 때 창을 강제로 닫게 되면 인터프리터까지 같이 종료됩니다.

농담 한마디 하자면, Windows 입장에서 보았을 적에 이와 같이 메시지 루프를 제공해주지 않아서 얼어버린 창과 마찬가지로 창에 연결된 실제 프로세스도 이런 상황이 오면 응답이 없는 것으로 간주한 것입니다. 상당히 아둔한 처리 방식이라는 것을 알 수 있죠. 그렇긴 해도 대개의 경우 연결된 프로세스가 삼천포로 빠졌기 때문에 창에 관련된 메시지 루프를 끌고가지 못하기 때문에 이와 같이 처리하도록 프로그래밍했다고 볼 수 있겠습니다.

이번 Chapter는 좀 길었던것 같네요. 다음 Chapter도 기대해주세요. ^^

댓글 남기기