본문 바로가기

_Programming/Python

Basic.모듈과 패키지

모듈(Module)

필요한 것들이 부품처럼 잘 만들어져 있는 파일

필요에 맞게 부품을 가져다 쓰는 것처럼 사용자의 용도에 맞게 파일을 가져다 쓰면된다.

주의점은 import할 때 모듈 파일은 사용하고자 하는 파일과 같은 경로상에 존재하거나 library상에 존재해야 한다.

# 기본 import
import theater_module
theater_module.price(3)
theater_module.price_morning(3)
theater_module.price_soldier(3)

# import명이 길때는 as 이용하여 별칭사용
import theater_module as mv
mv.price(3)
mv.price_morning(3)
mv.price_soldier(3)

# module에 해당하는 내용은 전부 가져다 쓰겠다고 선언
from theater_module import *
price(3)
price_morning(3)
price_soldier(3)

# 필요한 함수만 가져다 쓰기01
from theater_module import price, price_morning
price(3)
price_morning(3) # 'price_soldier' is nod defined

# 필요한 함수만 가져다 쓰기02
from theater_module import price_soldier as price
price(3) # 여기서 price는 price_soldier

패키지(Package)

모듈들을 모아 놓은 집합으로 모듈을 파일이라고 한다면 패키지는 폴더라고 볼 수 있다.

# vietnam.py
class VietmanPackage:
    def detail(self):
        print("[베트남 패키지 3박 5일] 다낭 효도 여행 60만원")
# thailand.py
class ThailandPackage:
    def detail(self):
        print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원")

 

패키지 import방법은 아래와 같다.

# prcatice.py

# import시 주의점 : 클래스나 함수를 바로 import할 수 없다.
import travel.thailand
trip_to = travel.thailand.ThailandPackage()
trip_to.detail()

# pakage 바로 import방법
from travel.thailand import ThailandPackage
trip_to = ThailandPackage()
trip_to.detail()

# 
from travel import vietnam
trip_to = vietnam.VietmanPackage()
trip_to.detail()

#from random import *
from travel import *
trip_to = vietnam.VietmanPackage()
trip_to.detail() # NameError: name 'vietnam' is not defined

from random import * 과는 다르게 travel을 모두 import했음에도 읽어오지 못하는데

이는 내가 공개 할 패키지와 비공개할 모듈을 설정하지 않았기 때문이다.

# __init__.py
__all__ = ["vietnam", "thailand"]

따라서 __init 함수에 공개할 모듈 목록을 설정 해두면

from travel import * 구문도 정상 작동 된다.

모듈직접실행

모듈 내에 if/else문을 이용하여 모듈을 모듈내에서 사용하는지 모듈 외부에서 사용하는지 알아 볼 수 있다.

아래와 같이 코드를 작성하고 모듈내에서(thailand.py) 실행 할 경우는 if문을 따라

'Thailand 모듈을 직접 실행','이 문장은 모듈을 직접 실행할 떄만 실행되요'의 두 문구가 출력되고

모듈외부에서(practice.py)에서 실행 할 경우 esle문을 따라 'Thailand 외부에서 모듈 호출'이 출력됨을 알 수 있다.

# thailand.py
class ThailandPackage:
    def detail(self):
        print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원")
        
if __name__ == "__main__":
    print("Thailand 모듈을 직접 실행")
    print("이 문장은 모듈을 직접 실행할 떄만 실행되요")
    trip_to = ThailandPackage()
    trip_to.detail()
else:
    print("Thailand 외부에서 모듈 호출")

패키지 모듈 위치

현재 폴더 구조는 다음과 같다.

inspect를 통해 파일의 경로가 현재 어디인지 알아 볼 수 있으며,

필요에 따라 내 파일을 내장되어 있는 lib폴더로 이동하여도 무방하다.

 

# 경로 확인 방법
import inspect
import random
print(inspect.getfile(random))
print(inspect.getfile(thailand))
print(inspect.getfile(inspect))

lib로 파일 이동 할 경우 해당 파일이 있는 폴어를 열고 해당 파일을 lib에 복붙 한다.

후에 다시 한 번 위의 코드를 실행시 아래와 같이 폴더의 경로가 바뀌었음을 알 수 있다.

pip install

필요한 클래스 파일을 받아서 쓰는 법.

pypi.org/search/사이트로 Go!

 

필요한 부분을 검색하여 install을 '복'하고 VScode로 돌아가 콘솔창에 '붙'한다.

다운이 완료되면 실제로 사용해본다.

사용시에는 아래의 세문구를 VScode에 복붙하고 실행한다.

콘솔창에서 다음과 같이 나옴을 확인 할 수 있다.

 

 

 

현재 나에게 깔려 있는 pip목록을 확인 하려면 콘솔창에 pip list 를 입력한다.

또, 해당 pip의 정보를 알고 싶으면 콘솔창에 pip show 해당pip이름 을 입력한다.

 

pip명령어 정리

# 현재 설치된 pip들 목록
pip list
# 해당 pip 정보
pip show 해당파일이름
# 해당파일 업그레이드
pip install --upgrade 해당파일이름
# 해당파일 삭제
pip uninstall 해당파일이름

내장함수

Python자체에서 제공하고 있는 함수이다.

 

# input : 사용자가 입력을 받는 함수
language = input("무슨 언어 좋아해?")
print("{0}언어를 좋아해".format(language))

# dir : 어떤 객체를 넘겨줬을 떄 그 객체가 어떤 변수와 함수를 가지고 있는지 표시
print(dir())
import random # 외장함수
print(dir())
import pickle
print(dir())

print(dir(random))

list = [1,2,3]
print(dir(list))

name = 'Go'
print(dir(name))

외장함수

내장함수와는 다르게 직접 import를 해서 사용해야 하는 함수

docs.python.org/3/py-modindex.html 다음 사이트에서 확인 가능하다.

# 외장함수
# glob : 경로내의 폴더/ 파일 목록 조회(=윈도우 dir)
import glob
print(glob.glob("*.py")) # 확장자가 py인 경로내의 모든 파일

# os : 운영체제에서 제공하는 기본 기능
import os
print(os.getcwd()) # 현재 디렉토리 표시

folder = "sample_dir"

if os.path.exists(folder):
    print("이미 존재하는 폴더입니다.")
    os.rmdir(folder)
    print(folder,"폴더를 삭제하였습니다.")
else:
    os.makedirs(folder) # 폴더 생성
    print(folder,"폴더를 생성하였습니다.")

print(os.listdir()) # 파일들 목록 조회

# time : 시간 관련 함수
import time
print(time.localtime())
print(time.strftime("%Y-%m-%d %H:%M:%S"))
# datetime : 오늘날짜 
import datetime
print("오늘 날짜는", datetime.date.today())
# timedelta : 두 날짜 사이의 간격
today = datetime.date.today() # 오늘날짜
td = datetime.timedelta(days=100) # 100일 저장
print("우리가 만난지 100일은", today + td) # 오늘부터 100일 후 

Quiz

Quiz) 프로젝트 내에 나만의 시그니처를 남기는 모듈을 만드시오.

 

조건: 모듈 파일명은 byme.py

 

(모듈 사용 예제)

import byme

byme.sign()

 

(출력 예제)

이 프로그램은 나도코딩을 보고 습득하였습니다.

 

# byme.py
def sign():
    print("이 기록은 나도코딩의 파이썬 강좌 기반으로 만들어 졌습니다.")
    
# Quiz.py
import byme
byme.sign()

 

 

 

 

출처: www.youtube.com/watch?v=kWiCuklohd

 

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

Error.-m pip install --upgrade pip  (0) 2020.12.18
Basic.예외처리  (0) 2020.09.14
Basic.클래스  (0) 2020.09.11
Basic.입출력  (0) 2020.09.10
Basic.함수  (0) 2020.09.09