신군의 역학사전

[Python] 내가 작성한 코드 파일 import 해오기 본문

Python/Basic Grammar

[Python] 내가 작성한 코드 파일 import 해오기

긔눈 2024. 5. 27. 12:00
반응형

코드 파일 임포트(import)

코드를 짤 때 다양한 모듈들을 import하여 사용하는 경우가 정말 많은데, 사실 이는 남이 짜놓은 코드 파일을 불러와서 사용하는 것입니다. 예를들어, numpy라는 모듈을 임포트해서 배열을 선언하는 상황을 가정해보자면, numpy라는 파일명의 잘 짜여진 코드파일을 불러와, 해당 코드파일 내 배열을 만들어주는 함수를 사용하게 되는거죠. 따라서 같은 방법으로, 개개인이 직접 짠 코드 역시 모듈처럼 임포트해서 사용할 수 있습니다.
 

import numpy as np
a = np.zeros(2)

 
여기서 numpy라는 부분은 불러올 코드파일명이 대체하게 되고, np부분은 내가 현재 코드파일 내에서 사용할 단축어로 대체하면 됩니다.

import fuelcell as fc

 
따라서, fuelcell.py라는 코드파일을 불러와 단축키 fc로 사용하고 싶다면, 위와 같이 임포트해올 수 있습니다. 여기서 불러올 코드 파일이 내가 현재 작성 중인 코드 파일과 동일 폴더에 위치한다면, 단순히 위와 같이 불러올 수 있고, 하위, 상위폴더 또는 다른 폴더에 위치한 경우, sys모듈을 활용하여 파일 경로를 지정해주어야 합니다.
 

상위 폴더

기본적인 프로젝트 구성은 아래와 같이 해봤습니다.

Project/
├── Sample_Folder/
│   ├── current_directory/
│   │   └── main.py
│   └── sample_module.py

Sample_Folder안에 Current Directory라는 폴더와 sample_module.py라는 임포트해올 코드파일이 함께 들어있으며, Current_Directory 폴더 내에 main.py라는 코드파일에서 sample_module.py라는 코드파일을 임포트해오고자 합니다.

sample_module.py 코드는 위와 같습니다. 임포트해온 후 check함수를 호출해 문자열을 출력해보겠습니다.

import sys
import os

sys.path.append(os.path.abspath('../'))

import sample_module as sm

이 경우, 한단계 상위폴더에 있는 코드파일을 불러와야하므로, 상위폴더에 대한 파일경로를 추가해주어야 합니다. 이부분은 sys와 os 모듈을 활용하여 지정해줄 수 있습니다.

 

../ 는 상위폴더의 의미를 지니는 명령어 입니다. 지금은 한단계 위의 폴더이므로 한번만 입력해주면 됩니다. 2단계 위의 폴더면 ../../ 와 같이 2번 입력해주면 됩니다. 실행결과는 아래와 같습니다.

 

 

하위 폴더

기본적인 프로젝트 구성은 아래와 같습니다. 

Project/
└── Sample_Folder/
    ├── main.py
    └── subfolder/
        └── sample_module.py

 

Sample_Folder내에 main.py라는 코드파일과 subfolder라는 폴더가 있고, subfolder안에 임포트해올 sample_module.py 가 존재합니다. 따라서 main.py에서 하위폴더에 위치한 sample_module.py라는 코드파일을 임포트해오고자 하는 상황입니다.

 

import sys
import os

sys.path.append(os.path.abspath('subfolder'))

import sample_module as sm

 

같은 디렉토리상 존재하는 코드파일이 아니므로, 역시나 별도로 파일경로를 지정해주어야 합니다. 하위폴더의 경우 해당 폴더명을 파일경로에 추가해주면 됩니다. 여기서 하위폴더명이 subfolder 이므로 해당 폴더명을 os.path를 통해 지정해줍니다.

 

실행결과는 아래와 같습니다.

 

 

다른 경로

상위 & 하위 폴더에서의 import 방법을 종합하면, 다른 경로 상 위치한 모든 파일을 import해올 수 있습니다. 예시 프로젝트는 아래와 같이 구성해보앗습니다. 

Project/
├── Sample_Folder/
│   └── sample_module.py
└── current_directory/
    └── main.py

 
Sample_Folder내에 임포트하고자 하는 sample_module.py라는 코드 파일이 위치해있고, 현재 작업 중인 디렉토리는 current_directory 폴더로, 해당 폴더 내 main.py 코드 상에서 모듈 파일을 임포트해오고자 합니다.
 
현재 폴더 구조를 보면, Sample_Folder와 current_directory는 Project라는 상위폴더에 함께 위치해있습니다.따라서 current_directory에서 한단계 상위 폴더로 이동 후에야 Sample_Folder에 접근할 수 있습니다.

import sys
import os

sys.path.append(os.path.abspath('../Sample_Folder'))

import sample_module as sm

 
따라서 [상위폴더] - [Sample_Folder]순의 경로지정을 별도로 해주어야하며, 마찬가지로 sys,os 모듈을 활용하여 지정해줄 수 있습니다. 
 

 
따라서 불러온 모듈 내, check라는 함수를 불러오면, 짜뒀던 프린트문이 정상적으로 호출됩니다.

Root/
├── Sample_Folder/
│   └── sample_module.py
└── Level1/
    └── Level2/
        └── current_directory/
            └── main.py

 
마찬가지로 특정 폴더에 접근하기 위해, 2단계 이상 상위폴더로 이동해야한다면, 이동해야하는 만큼 [../]를 경로에 추가지정해주면 됩니다.

import sys
import os

sys.path.append(os.path.abspath('../../../Sample_Folder'))

import sample_module as sm

 

물론 아래와 같이 sample_module.py의 절대경로를 따와 append 해주어도 가능합니다.

import sys
import os

sys.path.append(os.path.abspath('C:/Users/SHJ/Desktop/Sample_Folder'))

import sample_module as sm

 

 

저는 보통 project별 폴더내에 모듈 폴더를 따로 만들어 관리하기 때문에 사실상 절대경로를 활용할일이 많지는 않습니다. 이마저도 버전관리가 쉽지않아 아예 pip상에 설치하는 방법도 있는데, 이는 차후 정리해보도록 하겠습니다.

 

반응형