티스토리 뷰
1. 모듈을 사용하는 이유
파이썬에서 모듈은 상수 , 변수, 함수, 클래스를 포함하는 코드가 저장된 파일이다. 모듈은 다른 모듈에서도 불러서 실행할 수도 있고 파이썬(혹은 IPython) 콘솔이나 주피터 노트북에서 불러서 실행할 수도 있다. 지금가지는 모듈을 사용하지 않고 코드를 작성했지만 파이썬으로 코딩할 때는 다음과 같은 이유로 모듈을 활용하기 때문에 모듈의 사용법은 꼭 익혀야 한다.
-모듈로 나누면 코드 작성과 관리가 쉬워진다.
규모가 작은 프로그램은 하나의 파일에 모든 코드를 작성해도 문제가 없다. 하지만 어느 정도 규모가 있는 프로그램을 만들 때 파일 하나에 모든 코드를 작성하면 코드가 복잡해져 관리하기가 어려워진다. 따라서 어느 정도 규모가 큰 프로그램을 작성할 경우 파일 하나에 전체 코드를 구현하지 않고 기능별로 나눈 후에 여러 파일에서 해당 기능의 코드를 구현한다. 그러면 하나의 코드 파일에서는 해당 기능의 구현에만 신경 쓰면 되므로 코드 작성과 관리가 편해진다.
-이미 작성된 코드를 재사용할 수 있다.
특정 프로그램을 만들기 위해 작성한 모듈은 다른 코드를 만들 때도 활용할 수 있다. 즉, 특정 기능을 구현한 모듈은 다른 프로그램을 작성할 때 재사용할 수 있다. 이렇게 되면 코드를 다시 만들지 않아도 되니 코드를 발리 작성할 수 있다. 또한 자신이 만든 모듈뿐 아니라 다른 사람이 만든 모듈도 사용할 수가 있다.
-공동 작업이 편리해진다.
규모가 큰 프로그램을 만들 때는 일반적으로 여러 사람이 같이 작업을 진행한다. 공동으로 프로그램을 만들 때는 전체 프로그램을 모듈별로 설계하고 개인별로 나누어 코딩한 후 전체 모듈을 통합한다. 이처럼 모듈별로 구분해 코드를 작성하면 자신이 맡은 모듈만 신경 쓰면 되므로 공동 작업으로 인한 복잡성이 줄고 효율은 높아진다.
2. 모듈 생성 및 호출
이제 실제로 모듈을 만들고 호출하고 활용하는 방법을 알아보겠다. 모듈은 파이썬 코드가 저장된 파일이라고 했다. 모듈 이름은 확장자(.py)를 제외한 파일 이름이다. 예를 들어 my_module이라는 모듈을 만들고 싶으면 'my_module.py' 파일로 저장하면 된다. 파일로 저장된 모듈을 활용하려면 모듈이 저장된 위치(경로)에서 파이썬(혹은 IPython) 콘솔 혹은 주피터 노트북을 실행해서 코드를 작성하거나 파이썬 코드 파일을 실행하면 된다. 또 다른 방법은 모듈이 저장된 위치(경로)를 지정하는 것이다. 이렇게 하면 모듈과 같은 위치(경로)에서 파이썬(혹은 IPython) 콘솔 혹은 주피터 노트북을 실행해서 코드를 작성하거나 파이썬 코드 파일을 실행하면 된다. 또 다른 방법은 모듈이 저장된 위치(경로)를 지정하는 것이다. 이렇게 하면 모듈과 같은 위치(경로)에 있지 않더라도 모듈을 수행할 수 잇다.
모듈을 생성하고 호출하는 방법을 알아보기 위해 먼저 모듈을 만드는 방법을 알아보고 모듈과 동일한 위치와 다른 위치에서 모듈을 호출하는 방법을 알아보겠다.
모듈 만들기
모듈을 만드는 방법은 간단하다. 코드를 '모듈이름.py'로 저장하기만 하면 된다. 코드를 파일로 저장하기 위해 다른 에디터를 이용할 수도 있지만 여기서는 주피터 노트북에서 사용할 수 있는 IPython의 내장 마술 명령어(magic command)인 '%%writefile'을 이용해 코드를 파일로 저장하겠다.
간단한 모듈을 작성해서 다음과 같은 작업 폴더('C:\myPyCode')에 저장하겠다.
In:
|
%%writefile C:\myPyCode\my_first_module.py # File name: my_first_module.py
def my_function( ): print("This is my first module.") |
Out: |
Writing C:\myPyCode\my_first_module.py |
파일이 잘 생성됐는지 확인하기 위해 다음과 같이 윈도우 명령어인 type 명령어를 이용해 파일을 화면으로 출력해 보겠다.
In: !type C:\myPyCode\my_first_module.py Out: # File name: My_first_module.py def my_function( ): print("This is my first module.")
모듈 불러오기
이번에는 생성된 모듈을 사용하는 방법을 살펴보겠다. 모듈은 다음과 같이 import를 이용해 부른다.
import 모듈명 |
모듈을 임포트한 후에는 '모듈명.변수', '모듈명.함수( )', '모듈명.클래스( )'와 같은 형식으로 모듈에서 정의한 내용을 사용할 수 있다. 모듈을 불러올 때 'import 모듈명.py'를 입력하지 않도록 주의하자.
앞에서 만든 모듈을 부르기 위해서는 모듈이 있는 위치로 이동해야 한다. 모듈을 작업 폴더('C:\myPyCode')에 만들었으므로 작업 폴더로 이동해서 모듈을 부르겠다.
In: cd C:\myPyCode Out: C:\myPyCode
이제 앞에서 만든 모듈(my_first_module)을 불러서 모듈의 함수를 실행해 보겠다.
In: import my_first_module my_first_module.my_function( ) Out: This is my first module.
여기서는 앞에서 만든 my_first_module 모듈을 'import 모듈명'으로 불러왔고 모듈의 함수는 '모듈명.함수( )'로 실행했다.
앞에서는 모듈을 불러오기 위해 모듈이 있는 위치로 이동한 후에 모듈을 불러왔다. 하지만 모듈의 경로를 지정하면 모듈을 부르는 위치에 상관없이 어디서나 모듈을 불러와서 실행할 수 있어서 모듈이 있는 위치로 이동할 필요가 없다.
작업 폴더 안에 modules 폴더('C:\myPyCode\modules')에 모듈을 저장하고 모듈의 경로를 지정해 다른 위치에서 이 모듈을 부르겟다. 모듈의 경로는 PYTHONPATH 환경 변수 설정을 통해 지정하는데, 이미 통합 개발 환경인 Spyder의 PYTHONPATH 환경 변수 설정을 통해 지정하는데,통합 개발 환경인 Spyder의 PYTHONPATH Manager를 통해 'C:\myPyCode\packages' 폴더를 경로로 지정했다. 다음과 같은 윈도우 명령어를 통해 PYTHONPATH 환경 변수 설정이 잘 됐는지 확인할 수 있다.
In: |
!echo %PYTHONPATH% |
Out: |
C:\myPyCode\packages;C"\myPyCode\Modules |
이제 'C:\myPyCode\modules' 폴더에 다음과 같이 코드를 작성해서 my_area 모듈을 생성한다. 이 모듈에서 square_area( ) 함수는 변의 길이를 입력받아 정사각형의 넓이를 반환하며, circle_area( ) 함수는 반지름의 길이를 입력받아 원의 넓이를 반환한다.
In:
|
%%writefile C:\myPycode\modules\my_area.py # File name: my_area.py
PI = 3.14 def square_area(a): # 정사각형의 넓이 반환 return a ** 2
def circle_area(r): # 원의 넓이 반환 return PI * r ** 2 |
Out: |
Writing C:\myPyCode\modules\my_area.py |
모듈이 저장된 위치가 아닌 위치에서 모듈을 불러오기 위해 다음과 같이 작업 폴더로 이동하겠다.
In: |
cd C:\myPyCode |
Out: |
C:\myPyCode |
이제 앞에서 생성한 my_area 모듈을 import로 불러온 후 my_area 모듈에 있는 변수와 함수를 호출하겠다.
In:
|
import my_area # 모듈 불러오기
print('pi =', my_area.PI) # 모듈의 변수 이용 print('square area =', my_area.square_area(5)) # 모듈의 함수 이용 print('circle area =', my_area.circle_area(2)) |
Out:
|
pi = 3.14 square area = 25 circle area = 12.56 |
오류 없이 실행되면 해당 모듈을 잘 불러온 것이다. 모듈의 경로가 PYTHONPATH 환경 변수에 지정돼 있으면 이처럼 모듈이 있는 폴더('C:\myPyCode\modules')와 모듈을 부르는 폴더('C:\myPyCode')가 달라도 해당 모듈을 불러올 수 있다. 앞에서 설명한 대로 모듈을 불러온 이후에 '모듈명.변수', '모듈명.함수( )'의 형식으로 모듈 내의 변수와 함수를 호출했다.
불러온 모듈에서 사용할 수 있는 변수, 함수, 클래스를 알고 싶다면 'dir(모듈명)'을 이용하면 된다. 앞에서 생성한 my_area 모듈에서 정의한 내용을 알고 싶다면 다음과 같이 수행한다.
In: |
dir(my_area) |
Out:
|
['PI', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__pacage__', '__spec__', 'circle_area', 'square_area'] |
출력된 결과를 보면 my_area 모듈에서 정의한 변수 PI와 함수 circle_area( )와 square_area( )가 있다. 모듈에서 정의한 변수와 함수뿐만 아니라 '__문자__' 형태의 정의하지 않는 것들도 있지만 이것은 특수한 용도로 사용되는 것으로 지금은 신경 쓰지 않아도 된다.
모듈을 불러오는 다른 형식
-모듈의 내용 바로 선언
앞에서는 모듈 내의 변수와 함수를 호출하기 위해 'import 모듈명'으로 모듈을 불러와 '모듈명.변수', '모듈명.함수()'와 같은 형식을 이요했다. 이 경우 모듈 내에서 정의한 내용을 호출하기 위해 계속해서 모듈명을 써야 하므로 코드를 작성할 때 불편하다.
다음과 같은 형식으로 선언하면 모듈 내에 있는 변수와 함수, 그리고 클래스를 '모듈명.' 없이 '변수', '함수()', '클래스()' 처럼 직접 호출해서 이용할 수 있다.
from 모듈명 import 변수명 from 모듈명 import 함수명 from 모듈명 import 클래스명 |
다음은 'from 모듈명 import 변수명' 형식으로 모듈에서 변수를 바로 불러와서 사용하는 예이다.
In:
|
from my_area import PI #모듈의 변수 바로 불러오기
print('pi =', PI) # 모듈의 변수 이용 |
Out: |
pi = 3.14 |
이제 '모듈명.변수명'과 같이 모듈명을 지정해 변수를 불러오지 않고 모듈의 변수명으로 변수를 바로 이용할 수 있기 때문에 코드 작성이 간편해졌다.
다음은 모듈 함수를 'from 모듈명 import 함수명' 형식으로 바로 불러서 사용하는 예이다.
In:
|
from my_area import square_area
print('square area =', square_area(5)) # 모듈의 함수 이용 |
Out:
|
square area = 25 |
위의 예에서는 모듈의 변수와 함수를 이용하기 위해 'from 모듈명 import 변수명'과 'from 모듈명 import 함수명'으로 필요한 변수와 함수 개수만큼 각각 선언해서 이용했다. 하지만 'from 모듈명 import 변수명/함수명/클래스명'은 하나만 선언할 수 있는 것이 아니라 콤마(,)로 구분해서 여러 개를 선언할 수 있다.
다음은 불러오려는 변수와 함수를 콤마를 이용해 여러 개 선언해서 이용한 예이다.
In:
|
from my_area import PI, square_area, circle_area
print('pi=', PI) # 모듈의 변수 이용 |
Out:
|
pi= 3.14 |
만약 모듈의 모든 변수, 함수, 클래스를 바로 모듈명 없이 바로 이용하고 싶다면 다음과 같은 형식으로 선언한다.
from 모듈명 import * |
다음은 'from 모듈명 import *' 형식으로 선언해서 모듈 내의 모든 변수, 함수, 클래스를 불러오는 예이다.
In:
|
from my_area import *
print('pi=', PI) # 모듈의 변수 이용 |
Out:
|
pi= 3.14 |
'from 모듈명 import *' 형식으로 선언하는 방법은 일일이 '모듈명.'을 쓰지 않고 모듈 내의 변수, 함수, 클래스를 사용할 수 있어서 편리하기는 하지만 모듈을 두 개 이상 이용할 때는 주의가 필요하다.
다음 예제를 살펴보자. 다음 예제에서는 my_module1과 my_module2 모듈을 작성하겠다.
In:
|
%%writefile C:\myPycode\modules\my_module1.py # File name: my_module1.py
def func1(): print("func1 in my_module1 ")
def func2(): print("func2 in my_module1 ") |
Out: |
Writing C:\myPycode\modules\my_module1.py |
In:
|
%%writefile C:\myPycode\modules\my_module2.py # File name: my_module2.py
def func2(): print("func2 in my_module2 ")
def func3(): print("func3 in my_module2 ") |
Out: |
Writing C:\myPycode\modules\my_module2.py |
모듈 my_module1에는 func1 함수와 func2 함수가 있고 my_module2에는 func2 함수와 func3 함수가 있다. 여기서 함수 func2는 my_module1에도 있고 my_module2에도 있다. 이때 my_module1과 my_module2를 'from 모듈명 import *' 방법을 이용해 각 모듈의 함수를 불러온다면 모듈 my_module1과 모듈 my_module2에 공통으로 있는 func2는 어떤 것이 실행될까? 다음을 살펴 보자.
In:
|
from my_module1 import *
func1() |
Out: |
func1 in my_module1 |
위의 예처럼 코드는 오류 없이 잘 수행된다. 모듈 my_module1과 모듈 my_module2에만 각각 존재하는 func1과 func3은 불러오는 데 문제가 없었다. 하지만 모듈 my_module1과 모듈 my_module2에 모두 있는 func2 함수를 호출하면 나중에 선언해서 불러온 모듈의 함수가 호출된다. 앞의 모듈 선언 순서와는 반대로 'from my_module2 import *'를 'from my_module1 import *'보다 먼저 선언하고 코드를 실행해 보겠다.
In:
|
from my_module2 import *
func1() |
Out:
|
func1 in my_module1 |
출력 결과를 보면 func2()를 호출했을 때 이번에는 my_module1 모듈에서 함수를 불러온 것을 알 수 있다. 앞의 예에서 볼 수 있듯이 여러 모듈을 동시에 'from 모듈명 import *' 형식으로 선언해서 모듈 내의 변수, 함수, 클래스 이용할 때는 주의해야 한다.
-모듈명을 별명으로 선언
'import 모듈명' 형식으로 모듈을 선언해서 이용할 경우 '모듈명.변수', '모듈명.함수()', '모듈명.클래스()'와 같은 형식으로 모듈에서 정의한 내용을 불러오는데 코드에서 매번 모듈명을 입력하기가 번거롭다. 특히 모듈명이 길다면 입력이 더욱 번거러울 것이다. 'from 모듈명 import *'방법으로 선언해서 '모듈명.'을 생략할 수도 있지만 여러 모듈을 임포트할 경우에는 주의가 필요하다. 이런 문제는 다음과 같이 모듈명에 새로운 이름(별명)을 붙이면 해결할 수 있다.
import 모듈명 as 별명 |
위와 같이 선언하면 코드를 작성할 때 '모듈명.변수', '모듈명.함수()', '모듈명.클래스()' 대신 '별명.변수', '별명.함수()', '별명.클래스()' 처럼 지정할 수 있다.
모듈뿐 아니라 변수명, 함수명, 클래스명도 다음과 같이 별명을 붙일 수 있다.
from 모듈명 import 변수명 as 별명 from 모듈명 import 함수명 as 별명 from 모듈명 import 클래스명 as 별명 |
이 경우에도 변수명, 함수명, 클래스명 대신 별명으로 이용할 수 있다.
다음은 모듈을 불러올 때 모듈명 대신 별명을 사용하는 예이다.
In:
|
import my_area as area # 모듈명(my_area)에 별명(area)을 붙임
print('pi=', area.PI) # 모듈명 대신 별명 이용 |
Out:
|
pi= 3.14 |
보다시피 모듈의 변수나 함수를 부를 때 모듈명 my_area 대신 별명인 area를 이용했다.
다음으로 'from 모듈명 import 변수 명/함수 명/클래스 명 as 별명'의 예를 살펴보겠다.
In:
|
from my_area import PI as pi
print('pi=', pi) # 모듈의 변수의 별명 이용 |
Out:
|
pi= 3.14 |
위의 코드에서는 모듈 my_area의 내의 변수 PI의 이름을 pi로, 함수 이름 square_area와 circle_area를 각각 square와 circle로 별명을 붙이고 코드에서 별명을 이용했다.
출처: 파이썬 철저 입문
'beginner > 파이썬 분석' 카테고리의 다른 글
데이터 분석을 위한 패키지-pandas ② (0) | 2019.01.17 |
---|---|
데이터 분석을 위한 패키지-pandas ① (0) | 2019.01.16 |
문자열과 텍스트 파일 데이터 다루기 ② (0) | 2019.01.15 |
문자열과 텍스트 파일 데이터 다루기 ① (0) | 2019.01.14 |
객체와 클래스 ② (0) | 2019.01.14 |