본문 바로가기
IT 공부/Python

Python 모듈, import

by 쭈잇 2019. 6. 17.

Contents

    반응형

    python 모듈

    파이썬 프로그램 파일로 따로 함수나 변수를 정의 한다

    파이썬 스크립트를 작성할 때 매번 비슷한 클래스, 함수 코드의 중복을 피하기 위해 공통 부분을 따로 빼서 모듈과 패키지로 만든다

     

    모듈 : 변수, 함수, 클래스 등을 모아 놓은 스크립트 파일

    패키지 : 여러 모듈을 묶은 것

     

    모듈 검색 경로

    import sys
    print(sys.path)

    > D:\PycharmProject\python_ch2.7, ...

    모듈은 특정 디렉토리에서 찾게 된다. 실행되는 모듈의 위치는 기본적으로 포함된다

     

    다른 프로젝트에 있는 모듈 가져오기 

    import sys
    sys.path.append('D:/PycharmProject/python-modules')
    print(sys.path)
    import mymath
    
    print(mymath.pi)
    print(mymath.add(10,20))
    print(mymath.area_circle(10))

     

    NameSpace 

    프로그래밍 언어에서 특정한 객체를 이름에 따라 구분할 수 있는 범위를 말한다

    파이썬 내부의 객체와 특정 이름과 맵핑 관계를 갖게 되는데 이 맵핑을 포함하고 있는 공간을 네임스페이스라 한다

     

    Built in 빌트인 : 기본 내장 함수 및 기본 예외 들의 이름들이 소속

    Global 전역 : 모듈 전체에서 통용될 수 있는 이름들이 소속, 모듈별로 존재

    Local 지역 : 함수 및 메서드 별로 존재, 함수 내의 지역변수들의 이름들이 소속 

     

     

     출처: https://www.programiz.com/python-programming/namespace

     

     

     

     

     

    def outer_func():
        a=20
        def inner_func():
            a=30
            print('1 : ',locals())
        inner_func()
        print('2 : ',locals())
    
    a=10
    outer_func()
    print('3 : ',locals())
    
    >>
    1 :  {'a': 30}
    2 :  {'a': 20, 'inner_func': 
    <function outer_func.<locals>.inner_func at 0x000002A2829E47B8>}
    3 :  {'__name__': '__main__', '__doc__': None, '__package__': None, 
    '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002A2828D6550>,
    '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 
    '__file__': 'D:/cafe24/PycharmProject/python_ch2.7/namespace_ex1.py', '__cached__': None,
    'outer_func': <function outer_func at 0x000002A28288C1E0>, 'a': 10}
    

     

    "inner_func" 에서의 지역 네임스페이스는 지역변수 a=30만 포함

    "outer_func" 에서의 지역 네임스페이스는 'inner_func' 와 a=20을 포함

    모듈 전체에서 지역 네임스페이스는 사실 모듈의 전역 네임스페이스와 같다

     

     

    아래의 예를 통해 확인해보자

     

    def outer_func():
        a=20
        def inner_func():
            a=30
        inner_func()
    a=10
    outer_func()
    print(locals())
    print(globals())
    
    >>>
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': 
    <_frozen_importlib_external.SourceFileLoader object at 0x000002138FA96550>, 
    '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 
    '__file__': 'D:/cafe24/PycharmProject/python_ch2.7/namespace_ex2.py', '__cached__': None, 
    'outer_func': <function outer_func at 0x000002138FA4C1E0>, 'a': 10}
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': 
    <_frozen_importlib_external.SourceFileLoader object at 0x000002138FA96550>, 
    '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 
    '__file__': 'D:/cafe24/PycharmProject/python_ch2.7/namespace_ex2.py', '__cached__': None, 
    'outer_func': <function outer_func at 0x000002138FA4C1E0>, 'a': 10}
    

     

    모듈 전체에서 지역 네임스페이스는 사실 모듈의 전역 네임스페이스와 같음을 볼 수 있다

     

    if __name__ == '__main__' : 의미

     

     

     

     

     

    namespace 는 __main__ 이 나온다

     

     

     

     

     

     

     

                                      

     

     

    namespace  는 namespace_ex1.py

     

     

     

     

     

    print("Namespace:", globals()["__name__"]) 도 똑같이 namespace  는 namespace_ex1.py

     

     

    >>  if __name__ == '__main__':   

    현재 모듈의 네임스페이스가 __main__에 해당할 때만 if 문 이하를 실행하라

    최상위 모듈( 인터프리터에 실행되는 모듈)의 모듈이름은 "__main__" 이다 

     

     

    모듈은 한 번 가져오기만 하면 메모리에 적대되고 공유된다

     

     

    import 한 module 이름 열거하기

    > sys.modules 변수에 저장되어 있다

    import mod_a
    import  mod_b
    import  mymod
    import mymod2
    import sys
    
    for key in sys.modules.keys():
        print(key)

    legb.py
    legb-test.py

     

    import 시 그 파일이 한 번 실행되기 때문에

    import 될 파일에서 실행시킬 때,

    f() 로 따로 빼주는 게 아니라 if __name__ == '__main__' 을 사용한다.

     

    >> 그래서 이 상태로 아래것을 실행했을 때, 2번 실행되었

    그걸 막기 위해 

    legb.py

     


    | test01.py

    import pygame.sound.echo
    pygame.sound.echo.echo()

    > 함수를 사용하기에 ( 패키지+모듈) 이 너무 길기 때문에 form ~ import 를 사용해서 

    모듈만 import 하는 방법으로 해보자

     

     

    | test02. py

    from pygame.sound import echo
    
    echo.echo()

     

    | test03.py

    from pygame.sound.echo import echo
    echo()

     

    | test04.py

    import pygame.sound
    
    pygame.sound.echo.echo()

    >> ERROR!!

    >> 패키지를 import하면 __init__.py 에 정의된 것만 참조할 수 있다

     

    | test05.py

     

    from pygame.sound.echo import echo
    echo()

    >> ERROR!!

    >> from ~ import 아닌 import  단독으로 사용할 떄에는 모듈과 패키지가 마지막이어야 한다 

     

     


    __init__.py

    : 해당 디렉토리가 패키지일부임을 알리는 역할을 한다

     

    __init__.py 에 특정 모듈 지정하기

    ( /pygame/sound/__init.py)

    from . import echo

     

    __all__의 사용

    __all_은 다음과 같이 import 할때 작동한

    from pygame.sound import *
    pygame.sound.echo.echo()

    > 이 코드는 에러는 발생하지 않는다. init 에 설정해줘씩 때문.

     

    #/pygame/sound/__init__.py
    __all__=['echo']
    from . import echo

    > 만일 __all__ 변수만 설정해주는 경우 ERROR!

     

     

     

     

     

     

     

     

     

    [참고]

    https://hcnoh.github.io/2019-01-30-python-namespace

    반응형

    'IT 공부 > Python' 카테고리의 다른 글

    Python 크롤링 연습  (0) 2019.06.18
    Python 클래스(1) 클래스, 인스턴스 메서드/ 멤버, 인스턴스 변  (0) 2019.06.17
    Python 파일입출력 예제  (0) 2019.06.17
    Python 기초 str, tuple 등..  (0) 2019.06.13
    Python 기초  (0) 2019.06.12