2 minute read

1. 모듈

모듈의 개념과 import

파이썬에서 함수, 변수들과 같은 것을 파일에 넣고 스크립트나 인터프리터의 대화형 모드에서 사용할 수 있는 방법을 제공한다. 이런 파일을 모듈이라 부르며, 확장자가 .py이다. 모듈의 이름은 전역 변수 __name__으로 제공된다.

파이썬의 네임 스페이스는 지역 이름들을 포함하는 현재 함수의 스코프(지역 네임스페이스), 전역 이름들을 포함하는 현재 모듈의 스코프(전역 네임스페이스), 빌트인 이름들을 포함하는 최외곽의 스코프(빌트인 네임스페이스)이 있다.

# Fibonacci numbers module

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

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result
import fibo

fibo.fib(1000)
fibo.fib2(100)

fib = fibo.fib
fib(500)

이렇게 하면 파이썬 scope에 정의된 함수의 이름이 현재 namespace에 직접 추가되지 않는다. 모듈 이름 fibo만 추가하는 것이고, 모듈 이름을 사용하여 함수에 액세스할 수 있다. 그리고 함수를 자주사용 한다면, 지역 변수로 모듈을 대입해줄 수 있다.

from ~ import ~

각 모듈은 각자의 private namespace를 가지고 있고, 이는 모듈에 정의된 모든 함수에서 전역 namespace로 사용된다. 따라서 모듈 코드를 작성하는 사람은 모듈 사용자의 전역 변수나 잘못된 실수로 인해 충돌할 걱정 없이 전역 변수를 사용할 수 있다.

이 방식의 import는 local namespace에 가져오는 모듈 이름이 표시되지 않는다. (즉, 예제에서는 fibo가 정의되지 않는다.)

from fibo import fib, fib2

fib(500)
fib2(1000)

위처럼 해당 모듈의 변수, 클래스, 함수를 가져올 수 있다.

2. 다른 디렉토리에 있는 모듈 불러오기

2.1 부모 디렉토리가 같지만, 다른 폴더인 경우

부모 디렉토리의 절대 경로를 sys.path에 추가하면 된다.

C:.
├─Dir1
│  │  fibo.py
│  │  main.py
│  │
│  └─__pycache__
│          fibo.cpython-310.pyc
│
└─Dir2
        outside_module.py

위 파일 구조에서 Dir2의 outside_module.py를 import를 하려면 sys에 경로를 추가해야 한다. sys모듈이란 파이썬 라이브러리의 경로 관련된 작업을 할 수 있는 모듈이다. 그래서 sys.path에 사용하고자 하는 모듈의 경로를 append한다면 다른 경로의 모듈도 import할 수 있다.

우선 경로에서 사용할 수 있는 함수를 살펴보자.

  • __file__: 현재 실행중인 파일 이름을 반환한다. (내 경우는 절대 경로까지 다 작성되어 출력이 되었다.)
  • os.path.abspath(path): path의 정규화된 절대 버전을 반환한다.
  • os.path.basename(path): path의 기본 이름을 반환한다. path를 split()함수에 전달하여 path의 마지막 문자열을 return한다.
  • os.path.dirname(path): path의 디렉토리 이름을 반환한다.
  • os.pardir: 상위 디렉토리를 참조할 때 사용할 수 있다. pardir = '..'문자열로 선언되어 있다.

위 함수의 사용 및 결과

import os

print(__file__)
print(os.path.abspath(__file__))
print(os.path.basename(__file__))
print(os.path.dirname(__file__))
print(os.path.dirname(os.pardir))
output: 
c:\Users\Username\Desktop\Directory\Python\ImportPractice\Dir1\main.py
c:\Users\Username\Desktop\Directory\Python\ImportPractice\Dir1\main.py
main.py
c:\Users\Username\Desktop\Directory\Python\ImportPractice\Dir1


2.1.1 외부 디렉토리의 모듈 추가하기

import sys
from os.path import dirname, abspath

print(dirname(dirname(abspath(__file__))))
sys.path.append(dirname(dirname(abspath(__file__))))

from Dir2.outside_module import outside_moudle
outside_moudle()
c:\Users\ParkJunsu\Desktop\Directory\Python\ImportPractice
Test

pylint를 사용한다면, Unable to import ‘Dir2.outside_module’로 에러 메시지가 뜨지만 작동은한다. 이는 절대 경로로 넣어주거나 (from Dir2.outside_module import outside_moudle처럼) pylint 설정에 ‘–init-hook’과 sys.append()를 통한 경로를 추가해주면 해결되긴 한다. 파이썬에선 절대 경로로 import를 하는 것을 권장하기 때문에 linter에서 문제가 된다고 지적해주는 것이다.

2.2 현재 경로에서 하위 폴더에 모듈이 있는 경우

C:.
├─Dir1
│  │  fibo.py
│  │  main.py
│  │
│  ├─Subdir
│  │      Submodule.py
│  │
│  └─__pycache__
│          fibo.cpython-310.pyc
│
└─Dir2
    │  outside_module.py
    │
    └─__pycache__
            outside_module.cpython-310.pyc

Dir1의 main.py에서 Subdir의 Submodule.py 참조.

"""하위 디렉토리의 모듈 참조"""
from Subdir import Submodule

Submodule.submodule()



출처

파이썬 공식문서 - 모듈
점프 투 파이썬 - 모듈
os.path

Categories:

Updated: