본문 바로가기

Programming/Python

모듈

앞에서는 함수를 통해 우리가 프로그램 안에서 코드를 재사용하는 방법에 대해 알아보았다.
그러면 여러 함수들을 한꺼번에 불러들여 재사용하는 방법은 없을까?        이럴때 모듈을 이용한다.


모듈을 작성하는 데에는 여러가지 방법이 있다 , 가장 간단한 방법은 " .py " 확장자를 가진 파일을 하나 만들고 그 안에 함수들과 변수들을 정의해 두는 것이다.

모듈을 작성하는 또 한가지 방법은 우리가 현재 사용중인 파이썬 인터프리터를 만드는데 사용되는 프로그래밍 언어로 모듈을 작성하는 것이다.
예를들어 , 표준 파이썬 인터프리터를 사용중인 경우 C언어를 이용하여 모듈을 작성하고 컴파일하면 파이썬에서 이것을 불러와 사용할 수 있다.

다른 프로그램에서 import명령을 통해 모듈을 불러와 사용할 수 있다.    파이썬 표준 라이브러리 또한 동일하다.
일단 표준 라이브러리를 불러와 사용하는 방법을 알아보자.




표준 라이브러리중 하나인 sys 모듈을 import를 통해 불러왔다 , 
이건 단순히 파이썬에게 이 모듈을 앞으로 사용할 것이라고 알려주는 과정이라고 생각하면 편하다.
여기서 사용된 sys모듈은 파이썬 인터프리터와 인터프리터가 실행중인 환경, 즉 시스템(system)에 관련된 기능들이 담겨있다.


파이썬이 import sys 문을 실행하는 시점에서 , 파이썬은 sys모듈을 찾는다.    이 경우에는 내장모듈을 불러오는 것이므로 파이썬은 이미 어디서 이것을 불러와야 하는지 알고 있다.

만일 그렇지 않은경우 ,예를들어 파이썬으로 여러분이 직접 작성한 모듈인 경우 파이썬 인터프리터는 sys.path 변수에 정의된 디렉토리들에 해당 모듈이 있는지 검색한다.     그리고나서 모듈을 찾아내면 , 그 모듈 내부에 적혀있는 명령들이 읽어들여지게 되며 그 다음부터 모듈이 사용가능하게 된다,     이러한 초기화 과정은 첫번째로 모듈을 불러올때만 이루어진다는 걸 기억하자.


sys 모듈이 argv변수를 불러올 때 , 마침표를 이용하여 sys.argv와 같이 접근한다. 이와 같이 . 을 이용함으로써 뒤에 온 이름이 sys모듈에 존재한다는 것을 명시적으로 알려주고 , 또한 여러분의 프로그램에 사용될지 모를 argv라는 이름을 가진 변수와 충돌이 일어나는걸 방지한다.

sys.argv변수는 문자열의 리스트이다. 좀 더 구체적으로 sys.argv가 담고있는것은 명령줄 인수들의 리스트인데 , 이것은 명령줄로부터 프로그램을 실행시킬 때 함께 넘어온 인수들을 담고 있는 것이다.




from...import문



math로 부터 sqrt를 import해라
이렇게하면 math에 수많은 함수중 sqrt 함수만 가져와서 사용이 가능하다.


하지만 식별자 이름간의 충돌을 피하고 프로그램을 좀 더 읽기 쉽게 작성하기 위해 , 가능하면 이렇게 사용하는 경우를 피하고 import문을 사용하자.



모듈의 name 속성


모든 모듈은 이름을 갖고 있으며 , 모듈 내에 포함된 명령을 통해 모듈의 이름을 알아올 수 있다.
이 속성은 현재 모듈이 불러들여져서 사용되고 있는지 아니면 인터프리터에서 곧바로 실행되는것인지를 구분하는데 편리하게 사용될 수 있다.
모듈 내부의 코드는 모듈이 첫번째로 불러들여졌을 때 실행하게 된다.    이러한 속성을 통해 모듈이 외부로부터 불러들여졌을 떄와 곧바로 실행되었을 때에 각각 다르게 처리하도록 할 수 있다.    이를 위해 name 속성을 사용한다.

if __name__ =="__main__":
print("This program is being run by itself")
else:
print("I'm being imported from another module")

모든 파이썬 모듈은 name속성을 가지고 있다. 만약 그 이름이 "main"인 경우 , 이것은 모듈이 사용자로부터 직접 실행된 것임을 의미하며 따라서 이에 맞는 적절한 처리를 해줄 수 있다.



새로운 모듈 작성하기

모듈 작성은 쉽다 , 사실 우리가 지금까지 해왔던거랑 별 다를게 없다. 왜냐하면 모든 파이썬 프로그램은 곧 모듈이기 때문이다.
즉 " .py " 확장자를 가진 이름으로 저장되기만 하면 된다, 아래 예제를 mymodule.py로 저장하자


def say_hi():
print("Hi, this is mymodule speaking")

__version__ = '0.1'


위 모듈을 불러오기전에 위 파일이 아래 예제 프로그램과 같은 디렉토리에 있거나 혹은 sys.path 중 하나에 있어야 제대로 불러올수 있다.


import mymodule

mymodule.say_hi()
print("version",mymodule.__version__)

모듈의 구성요소에 접근하는 데에도 앞서 알아보았던 것과 동일하게 .을 이용하여 접근한다.
파이썬은 같은일을 하는데 같은 표기법을 사용한다,     따라서 뭔가 새로운 일을 하기위해 새로운 것을 또 배울 필요가 없다.


아래는 from..import구문을 이용하는 예제다.

from mymodule import say_hi,__version__

say_hi()
print("version",__version__)

결과 :    Hi, this is mymodule speaking

version 0.1


아래와 같이도 이용이 가능하다.

from mymodule import *


이것은 say_hi와 같이 모듈에 포함된 모든 공개된 이름들을 불러온다, 그러나 밑줄 두개로 시작하는 __version__과 같은 이름들은 불러오지 않는다.


dir 내장함수    

dir 내장 함수이용하여 객체에 정의되어 있는 모든 식별자들의 목록을 불러올 수 있다.
예를들어 , 모듈의 경우 함수와 클래스 및 변수들의 식별자가 정의되어 있을 것이다.

dir()함수에 모듈 이름을 넘겨주면 , 모듈 안에 선언된 식별자 이름들의 목록을 반환해준다.
아무것도 넘겨주지 않은 경우 , 현재 모듈에 선언된 식별자 이름들의 목록이 반환된다.
(이때 앞서 불러온 모듈의 이름도 이 목록에 포함됨을 확인!!)


sys모듈을 import 한 후 dir(sys)를 해보자
그러면 sys 모듈 내에 선언된 속성들의 식별자 이름 목록이 반환된다.

dir()를 하면 현재 모듈에 선언된 속성들의 식별자 이름 목록을 반환해준다.




패키지

지금까지 우리는 파이썬 프로그램의 계층 구조에 대해 어느정도 파악했다. 
변수는 함수 내부에 존재하며 , 함수와 전역 변수는 모듈안에 존재한다.
그렇다면 모듈은 어디에 포함될까?

파이썬에는 패키지라는 단위가 이에 해당된다,
패키지란 그냥 단순한 폴더다 , 파이썬에게 이 폴더는 파이썬 모듈을 담고있다는걸 알려주는 역할을 하는 init.py라는 특별한 파일을 하나 포함하고 있다.
우리가 'asia' , 'africa'라는 하위 패키지를 포함하고 있는 'world'라는 패키지를 만들고 싶다고 가정해보자.
또한 각각의 하위 패키지는 'india' , 'madagascar' 등등의 하위 패키지를 하나씩 더 갖고있다.
이 경우 ,아래와 같이 폴더 구조를 만들어 주면 된다.


- <some folder present in the sys.path>/

- world/

- __init__.py

- asia/

- __init__.py

- india/

- __init__.py

- foo.py

- africa/

- __init__.py

- madagascar/

- __init__.py

- bar.py

패키지는 계층적으로 모듈을 관리할 수 있게 편의상 구성하는것이다.
표준라이브러리에서 이러한 계층 구조를 많이 확인할 수 있다.

요약
함수가 재사용 가능한 프로그램의 한 부분인 것과 같이 모듈은 재사용 가능한 프로그램을 말하며,
패키지는 모듈을 구성하는 계층 구조를 말한다.    파이썬과 함께 설치되는 표준 라이브러리는 이러한 패키지와 모듈로 이루어진 한 예제다.

'Programming > Python' 카테고리의 다른 글

튜플  (0) 2017.11.11
파이썬의 자료 구조 , 리스트  (0) 2017.11.11
함수  (0) 2017.11.11
흐름 제어  (0) 2017.11.11
변수 ~  (0) 2017.11.11