Lecture 강의

Undergraduates 학부 Graduates 대학원 Lecture 역학 Lecture 설계 Lecture IT(IoT, AI) Lecture SAP2000 Lecture 아바쿠스 Lecture 파이썬 Lecture 엑셀 VBA Lecture 마이다스 Lecture 이탭스

[02. 문법] 2.6 모듈, 패키지, 파일 분할 - import, from, as, namespace

작성자 : kim2kie

(2023-02-19)

조회수 : 962

[참조]

 

프로그램을 작성하게 되면 거의 대부분 외부 라이브러리의 활용이 필요하다. 
프로그램의 규모가 커짐에 따라 자신이 직접 코딩한 소스도 분할하여야 한다. 
여기에 대응하는 개념이 모듈(module)과 패키지(package)이다.

(1) 모듈
(2) 패키지
(3) 파일 분할


 

(1) 모듈

1) 모듈의 정의

  • 모듈(module)은 재사용할 목적으로 작성된 파이썬 소스 파일이다.
  • import 문으로 로딩하여 사용한다. 
  • 예를 들어 os 모듈은 os.py 라는 파일로 작성되어 있으며 사용시에서는 import os 등으로 로딩한다.  
     
  • Ex)
    import os
    os.environ
    os.chdir() # 디렉터리 변경(change director)
    os.getcwd() # 현재 디렉터리 가져오기(get current working directory): 'C:\...'
    os.system('dir')
    os.system('cls')
    os.mkdir()
    os.path.dirname(path)   # Return the directory name of pathname path.
    os.path.basename(path)  # Return the base name of pathname path.
    os.rmdir()   # remove an empty directory.
    os.remove()  # remove a file.
    os.unlink()
    os.rename(src,dst)

     
  • Ex) Prompt 창에서 함수로 만들어 자주 사용하기 
    def cls:
        import os
        os.system('cls')

    >>> cls()

     
  • 모듈 내의 함수, 변수, 클래스 등은 module.xxx 등과 같은 형태로 사용한다. 이때 module은 namespace 역할을 한다.
    여기서 파이썬에서는 모든 것이 객체이고, 모든 객체들에 대해 이름(name)을 붙여 모아 둔 공간(space)을 namespace라 한다.

 

 

2) 모듈의 호출 방법

  • 여러가지 import 문의 변형이 가능하다.
     
  • Ex 1)
    from mysolver import *      # mysolve 모듈의 모든 것을 임포트
    xNewton = solve_by_newton(func,der,10)    

     
  • Ex 2)
    from mysolver import solve_by_newton, tol    # mysolve 모듈에서 solve_by_newton과 tol만 임포트
    xNewton = solve_by_newton(func,der,10)  
    print(tol)

     
  • Ex 3)
    import mysolver as solver    # 모듈의 이름을 solver로 변경하여 사용할 때
    xNewton = solver.solve_by_newton(func,der,10)   

     
  • Ex 4)
    from mysolver import solve_by_newton as solve    # 모듈의 일부 함수를 임포트하면서 이름을 변경할 때
    xNewton = solve(func,der,10)

     
  • import vs from
    import(가져오기)는 전체 모듈(module)을 가져오는 데 사용되며,
    from(불러오기)은 모듈(module)에서 특정 개체(object)를 가져오거나 모듈의 모든 개체(object)를 현재 네임스페이스(namespace)로 가져오는 데 사용된다.

 

3) 모듈 테스트

  • 모듈을 작성한 후 테스트를 수행하기 위해 스크립트로 실행될 수 있다. 
  • 이 경우 모듈 하단에 __name__ 속성이 '__main__'인지 확인하여 실행시키는 것이 일반적인 방법이다. 
  • 다음은 Python 공식 튜토리얼에 소개된 fibo 모듈이다.
     
  • Ex) fibo.py

    def fib(n):    # write Fibonacci series (피보나치 수열) up to n
        a, b = 0, 1
        while b < n:
            print(b, end=' ')
            a, b = b, a+b
        print()

    if __name__ == '__main__':
        import sys
        fib(int(sys.argv[1]))
      

  • fibo.py가 있는 디렉터리에서 다음과 같이 모듈을 실행한다.
     

  • Ex)
    > python fibo.py 100 

     

  • Ex)
    import fibo
    fibo.fib(100)  # 결과: 1 1 2 3 5 8 13 21 34 55 89

 

4) dir(모듈)

  • 내장함수 dir(module)은 모듈에서 정의하고 있는 변수, 함수 등등을 출력해 준다. 
  • 다음은 앞서 작성한 fibo 모듈에 대해 임포트 후 dir(fibo)를 적용한 예이다.
     
  • Ex)
    >>> dir(fibo)
    ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib']

     

 

(2) 패키지 

  • 패키지(package)는 모듈을 디렉터리 구조로 묽어 놓은 것이다. 
    예를 들어 os 모듈은 os.py라는 파일로 존재하지만 대표적 수치 패키지인 NumPy는 numpy라는 폴더 내에서 여러 모듈이 존재한다.
    패키지 라이브러리를 사용하는 것은 점(.; dot)으로 하위폴더 내에 있는 모듈을 import 할 수있다. 
    예를 들어 sound/effects/echo.py에 echofilter(...)라는 함수를 사용하려면 다음과 같다.

    (Note: 하위 폴더나 하위 함수를 호출하기 위해 점(.; dot)을 사용한다.
  • Ex 1)
    import sound.effects.echo
    sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)

     

  • Ex 2)
    from sound.effects import echo
    echo.echofilter(input,output,delay=0.7,atten=4)

     

  • Ex 3)
    from sound.effects.echo import echofilter
    echofilter(input,output,delay=0.7,atten=4)

     

  • Ex 4)
    from sound.effects.echo import *
    echofilter(input,output,delay=0.7,atten=4)

     

  • 부 패키지(sub-package) 자체를 임포트할 수도 있다.
     

  • Ex 5)
    from sound.effects import *
    echo.echofilter(input,output,delay=0.7,atten=4)

 


(3) 파일 분할
 

  • 하나의 파일로 만들면 파일이 크고 내용이 복잡하다. 
  • 이를 함수들을 구분하여 별도의 파일로 만든 후 import를 사용하여 불러 들일 수 있다.
     
  • Ex-main) beam.py

    import BeamFunctions as beam
    #
    m1=beam.ElementMass(m,L1);
    k1=beam.ElementStiffness(E,I,L1);
    M0=beam.Assemble(M0,m1,1,2);

     
  • Ex-sub) BeamFunctions.py

    def ElementMass(m,L):
    def ElementStiffness(E,I,L):
    def Assemble(K,k,i,j):