본문 바로가기
IT 공부/Python

Python 모듈, import

by 쭈잇 2019. 6. 17.
반응형

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 파일입출력 예제  (2) 2019.06.17
Python 기초 str, tuple 등..  (1) 2019.06.13
Python 기초  (0) 2019.06.12