Modules & Packages

0

Python

목록 보기
2/3
post-thumbnail

1. Module & Package 란 ?

1-1 ) Module

Python에서 변수나 함수 그리고 클래스 등을 모아놓은 파일으로, 코드의 재사용성을 개선하고, 코드의 길이가 너무 길어졌을 때 나누어서 정리하기 위해 사용됩니다.

예를 들어서, 반복문을 사용할 때 자주 사용되는 range() function 같은 경우, 저희가 직접 구현한 적은 없지만, 사용할 수는 있죠 ! 바로 이런 것들이 기본적으로 python에 설치되어 있는 "built-in module"의 기능 중 하나입니다. 저희가 파이썬으로 코딩할 때, 자주 사용하는 기능들을 미리 파이썬을 설치할 때 같이 포함된 것이죠 !


x = 1

for i in range(3):

	x += i
    
print(x)		# x == 4

모듈 생성 및 호출

모듈 파일 생성


# module_1.py 
# module로 사용할 파일 준비

variable_x = 3

def function_x():

	print("Hello")

class Class_x:

	def __init__(){
    
    		class_value = b
    	}

모듈 파일 호출


import module_1.py # 모듈 이름 집어넣으면 됨
  • import <모듈 이름>

  • 특정한 변수 / 함수 / 클래스의 호출을 원한다면, <모듈 이름>.<변수/함수/클래스 이름>

  • 혹은 from <모듈 이름> import <함수/변수/클래스 이름> ...

  • 요런식으로도 불러올수 있습니다.

  • p.s. : 모든 모듈의 변수/클래스/함수를 점 안찍고 해당 파일에 사용하고 싶다면, "from <모듈이름> import *" 이라고 하면되지요~

여러 모듈 사용시, 변수 이름 중복 해결 방법 (import ... as ....)

여러 모듈을 사용할 때, 어떤 변수와 함수들이 겹칠수 있기 때문에 다음과 같이 변수명을 지정 할 수 있어요 !


from module_1.py import variable_x as x

# x 라는 변수를 variable_x로 사용가능

1-2 ) Package

앞써 말한 Module 과 같이, Package는 다른 파일에서 불러와서 사용하는 개념이지만, 그 양과 복잡성이 더 심한 코드들이란게 차이점이죠 ! 이것은 하나의 directory 에 너무 많은 양의 파일이 들어가면, 유지보수의 어려움이 있기 때문에 밑의 그림 처럼 파일을 다른 directionary에 저장하고 해당 경로의 파일을 불러오는 식으로 진행됩니다.

package 파일 호출


from Game import *

import Sound.load

from Sound.load import track_1 as track_gamestart

# Sound.load.py 파일을 호출
# 'track_gamestart' 이란 변수를 사용가능

__init__.py 파일

위의 그래프를 보시면, 패키지는 __init__.py파일이 있는데, 이 파일은 package가 import 될때 항상 실행되어야 하는 기본값같은 역할을 하는 녀석입니다.

추가적으로, Package 내에서 import를 하여도 절대로 바뀌거나 접근이 허용되면 안되는 변수들을 제한할 수도 있고, 밑의 코드처럼 import 경로를 축소할 수 도있습니다.


# 다음과 같이 원래는 조금 복잡하게 접근하지만,
import Sound.load

Sound.load.play()


# __init__.py 에 다음과 같이 미리 import를 해두면

from Sound.load import play

Game.Sound.load.play()

# main.py 다른 파일에서 바로 호출을 할 수 있습니다.
from Sound.load import play

play()

package 변수 접근 제한하기

기본적으로 모든 변수는 __all__이라는 변수를 통해서 접근이 허용되는데, 이점을 이용해서 다음과 같이 접근을 제한할 수 있습니다.


# __init__.py
from Sound.load import func2
from Sound.load import func3


__all__ = ['func2', 'func3']


# main.py
from pkg import *


func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.

1-3 ) init.py 파일의 역할

파이썬은 __init__.py 파일을 통해 package 초기 설정을 가능하게 해준다. Package 안에 __init__.py 파일이 있으면 package가 import 될때 __init__.py 파일의 코드들이 자동으로 실행된다.

__init__.py 파일을 통해 일반적으로 아래와 같은 것들을 할 수 있다.

  1. Import 할때 경로의 총 길이 줄여주기

  2. Package에서 import 할 수 있는 변수/함수/클래스 제한하기

  3. 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들

2. Module/Package 찾는 방법

import로 Module/Package를 불러왔을 때, 변수/함수/클래스는 다음과 같은 방식으로 찾을 수 있어요.

2-1 ) Sys.module

import된 modules를 찾을때 가장 먼저하는 방식

sys.modules을 이용한 package/module 정보 확인

import sys
import math

print(sys.modules)

# {'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, 
# .... 
# 'math': <module 'math' (built-in)>}

다음과 같이 모듈/패키지를 설치하고 sys.module 을 통해서 해당 프로젝트에 설치된 모든 module 들을 알 수 있습니다. 만약 해당 모듈이 존재하지 않다면,


seungjae@seungjae-15Z90N-VA7BK:~/바탕화면/project$ /usr/bin/python3 /home/seungjae/바탕화면/project/test.py
Traceback (most recent call last):
  File "/home/seungjae/바탕화면/project/test.py", line 5, in <module>
    import 없는모듈
ModuleNotFoundError: No module named '없는모듈'

위와 같이 ModuleNotFoundError이 나오게 됩니다.

2-2 ) sys.path

기본적으로 list이며, string요소들ㅇ르 가지고 있는 list입니다.
각 modules/pakcages 가 어디에 위치해 있는지 위치를 나타내죠.

import sys
import math

list1 = ["a","b"]

print(sys.path)

#['/home/seungjae/바탕화면/project', '/usr/lib/python38.zip',
#'/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload',
#'/home/seungjae/.local/lib/python3.8/site-packages',
#'/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']

2-3 ) built-in modules

파이썬에서 기본적으로 제공하는 공식 라이브러리들 입니다.
Built-in 모듈들은 미리 포홤되어 있으므로 쉽게 찾을 수 있습니다.

2-4 ) python이 sys 모듈을 찾는 순서

python은 sys.modules -> built-in modules -> sys.path 순으로 모듈을 찾는다. sys는 built-in module이다. 때문에 import sys를 하면 파이썬은 built-in 모듈에서 sys를 찾아 실행한다.

3. Absolute Vs Relative Path

직접 개발한 local package 같은 경우, import 할때 해당 package의 위치에 맞게 import 경로를 잘 선언해야 합니다. Local package 를 import 하는 경로에는 absolute path 와 relative 가 있습니다. 아래의 설명으로 보시죠 !

3-1 ) Absolute path

해당 Package가 어디에 있든 항상 같은 절대 경로를 입력하여 Package import !


└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

한 가지 예제로 이렇게 위의 패키지의 요소들을 import 할때 다음과 같이 import를 진행 할 수 있습니다.


from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
  • 장점 : 절대 경로이기 때문에 패키지만 있다면, 어디에 있건 해당 경로를 tracking할 수 있다.
  • 단점 : 위의 예제처럼 모든 경로를 적어야기 때문에 경로 정보가 길어진다.

3-2 ) Relative Path

Absolute path와는 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 한 파일의 위치를 기준으로 경로를 정의합니다.

예를 들어서,

# subpackage1/module5.py
from ..module4 import class4

위의 예시와 같이, 해당 파일에서 점하나는 해당 파일위치에서 한단계 위의 파일 경로이고, 점 두개는 해당 파일에서 두단계 위의 파일 위치입니다. 이렇게 해서 상대 경로를 설정하여서, package를 import !

  • 장점 : 경로가 absolute보다 쉬워진다.
  • 단점 : 파일 위치가 달라지면, 귀찮지만 import 한 경로를 수정해야된다.
profile
# 개발 # 컴퓨터공학

0개의 댓글