TIL#28 import error 상대경로 절대경로

상대경로와 절대경로에서 어떤 경우에 import에러가 나타나는지 살펴보자. import os print(os.path.abspath('.')) #현재 폴더의 절대경로를 물어보는 것 C:\Users\Jaesang Choi\Desktop\CALC #현재 폴더의 절..

higher77.tistory.com

 

 

 

 

 

main.py

from calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))

 

multiplication.py

def multiply(a,b):
    return(a*b)

 

add_and_multiply.py

from calculator.multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

 

 

 

 

 

 

 

 

 

 

하위폴더 파일 import하기

<메인모듈 상관없음>

 

main.py를 기준으로 설명.

 

from calculator.add_and_multiply import add_and_multiply #함수를 가져옴

if __name__ == '__main__':
    print(add_and_multiply(1,2))
from calculator import add_and_multiply #모듈을 가져옴

if __name__ == '__main__':
    print(add_and_multiply.add_and_multiply(1,2))

 

 

 

 

 

 

 

 

동일폴더 파일 import하기

 

 

1) <메인모듈: main.py>일때 

 

add_and_multiply.py가 multiplication.py를 import한다.

 

 

 

 

add_and_multiply.py

from calculator import multiplication #절대경로 모듈

def add_and_multiply(a,b):
    return multiplication.multiply(a,b) + (a+b)
from calculator.multiplication import multiply #절대경로 함수

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

<메인모듈이 main.py>일 때는 os.getcwd()의 값이

 

C:\Users\Jaesang Choi\Desktop\CALC으로 나와서 calculator부터 절대경로를 설정해줘야한다.

 

 

 

 

from .multiplication import multiply #상대경로 함수

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
from . import multiplication #상대경로 모듈

def add_and_multiply(a,b):
    return multiplication.multiply(a,b) + (a+b)

 

 

 

 

 

 

2) <메인모듈: add_and_multiply.py>일때 

 

add_and_multiply.py가 multiplication.py를 import한다.

 

 

import multiplication #모듈

def add_and_multiply(a,b):
    return multiplication.multiply(a,b) + (a+b)
from multiplication import multiply #함수

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

<메인모듈: add_and_multiply.py> os.getcwd()의 값도

 

C:\Users\Jaesang Choi\Desktop\CALC으로 나오지만 그건 atom으로 폴더를 열 때

CALC를 열어서 그렇게 나오는 것이다.

 

atom으로 새창에서 add_and_multiply.py가 있는 calculator폴더를 열면

os.getcwd()의 값이 

C:\Users\Jaesang Choi\Desktop\CALC\calculator로 제대로 나온다.

 

그래서 바로 multiplication을 적는 것이다.

 

 

 

 

 

 

상위폴더 파일 import하기

 

 

 

 

 

<메인모듈 상관없음>

multiplication.py를 기준으로 설명.

 

 

devide.py를 추가했다.

def devi(a,b):
    return(a/b)

 

 

 

 

 

calculator폴더 안의 mutuplication.py에서 devide.py를 불러오고 싶을 때

#def multiply(a,b):
#   return(a*b)


import sys, os

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

import devide #모듈

print(devide.devi(6,2)) #3.0
#def multiply(a,b):
#   return(a*b)


import sys, os

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

from devide import devi #함수

print(devide.devi(6,2)) #3.0

 

실행파일 경로의 1단계 상위 폴더를 구하는 코드는 os.path.dirname(os.path.abspath(os.path.dirname(__file__))) 이다.

 

2단계 상위 폴더는

os.path.dirname(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))))이다.

 

 

 

 

 

 

 

 

 

 

calculator/mutuplication.py에서 calculator2/devide.py를 불러오고 싶을 때

#def multiply(a,b):
#   return(a*b)


import sys, os

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

from calculator2 import devide #모듈

print(devide.devi(6,2)) #3.0
#def multiply(a,b):
#   return(a*b)


import sys, os

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

from calculator2.devide import devi #함수

print(devi(6,2)) #3.0

 

 

 

 

 

 

 

 

 

 

 

다른경로의 파일 import

 

 

다른경로의 파일을 import할 경우

import sys

sys.path.append(다른 경로의 파일)

sys.path.append에 다른경로의 path를 넣어주면 된다.

 

 

 

 

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

sys.path.append를 사용하지 않고 하는 방법은 

시스템의 환경변수 PYTHONPATH에 프로젝트를 추가하는 방법이 있다.

 

이 방법은 모든 파이썬 프로젝트에서 built-in모듈을 그냥 import 할 수 있는 것과 마찬가지의 원리로

시스템의 파이썬 컴파일러가 기본적으로 참조하게 될 패키지 모듈에 자신의 프로젝트를 추가하는 형태이다.

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

 

 

 

 

 

os.path.dirname(os.path.abspath(os.path.dirname(__file__)))의미

print(os.path.dirname(__file__))
print(os.path.abspath(os.path.dirname(__file__)))
print(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))


C:\Users\Jaesang Choi\Desktop\CALC\calculator
C:\Users\Jaesang Choi\Desktop\CALC\calculator
C:\Users\Jaesang Choi\Desktop\CALC


경로 중 디렉토리명만 얻기
os.path.dirname("C:/Python35/Scripts/pip.exe") # "C:/Python35/Scripts"

특정 경로에 대해 절대 경로 얻기
os.path.abspath(".\Scripts") #"C:\Python35\Scripts"
os.path.abspath(".") #점(.)은 현재 디렉토리(작업 폴더)를 의미함으로 이것은 현재 디렉토리의 절대 경로를 얻는것이다.

현재 수행중인 코드를 담고 있는 파일의 위치 path
__file__

 

 

 

 

 

 

 

 

'Python > Today I learned' 카테고리의 다른 글

TIL#35 객체, 클래스, 인스턴스 관계정리(매우 중요)  (0) 2021.05.20
TIL#34 클래스 self  (0) 2021.05.20
TIL#33 CSV 파일 읽기 및쓰기  (0) 2021.05.19
TIL#32 파일 읽기 및 쓰기  (0) 2021.05.19
TIL#31 외장함수  (0) 2021.05.19

+ Recent posts