파이썬 프로젝트 루트 디렉터리 확인 방법

반응형

참고) 컴퓨터 파일 시스템은 하나의 루트 디렉터리로부터 뻗어나가는 식으로 파일이 구성되어 있다.

 

1. os.getcwd() 사용 (현재 작업 디렉터리 기준)

가장 간단한 방법은 os.getcwd() 함수를 사용하는 것. 이 함수는 현재 파이썬 스크립트가 실행되는 작업 디렉터리를 반환한다. 하지만 이 방법은 항상 프로젝트 루트 디렉터리를 반환한다고 보장할 수 없다. 왜냐하면 사용자가 스크립트를 실행하는 위치에 따라 결과가 달라질 수 있기 때문이다.

import os

root_dir = os.getcwd()
print(f"현재 작업 디렉터리: {root_dir}")

 

2. os.path.dirname(__file__) 사용 (스크립트 파일 기준)

__file__ 변수는 현재 실행 중인 스크립트 파일의 경로를 나타낸다. os.path.dirname(__file__) 함수는 이 경로에서 디렉터리 부분만 추출하여 반환한다. 이 방법은 스크립트 파일이 프로젝트 루트 디렉터리 바로 아래에 위치하는 경우에 유용하다.

import os

script_dir = os.path.dirname(__file__)
print(f"스크립트 디렉터리: {script_dir}")

3. 프로젝트 루트 디렉터리 명시 (가장 확실한 방법)

가장 확실한 방법은 프로젝트 루트 디렉터리를 명시적으로 지정하는 것이다. 프로젝트의 시작점(예: main.py)에 다음과 같이 루트 디렉터리를 정의하고, 이 변수를 사용하여 다른 파일의 경로를 참조할 수 있다.

import os

PROJECT_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) # 스크립트가 루트 디렉터리에 있다면
#PROJECT_ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 스크립트가 한 단계 아래에 있다면

print(f"프로젝트 루트 디렉터리: {PROJECT_ROOT_DIR}")

# 다른 파일 경로 참조 예시
# config_path = os.path.join(PROJECT_ROOT_DIR, 'config.ini')
  • os.path.abspath(__file__): 현재 스크립트 파일의 절대 경로를 반환
  • os.path.dirname(): 주어진 경로의 디렉터리 부분을 반환
  • os.path.join(): 경로를 안전하게 결합

만약 main.py 파일이 프로젝트 루트 디렉터리의 하위 디렉터리에 있다면, os.path.dirname()을 여러 번 사용하여 루트 디렉터리를 찾을 수 있다.

 

 

4. 프로젝트 설정 파일 검색 (고급 방법)

프로젝트 루트 디렉터리에 특정 파일(예: setup.py, pyproject.toml, .git)이 존재한다는 것을 알고 있다면, 해당 파일을 검색하여 루트 디렉터리를 찾을 수 있다.

import os

def find_project_root(path):
    """프로젝트 루트 디렉터리를 찾습니다."""
    current_dir = path
    while True:
        if os.path.exists(os.path.join(current_dir, 'pyproject.toml')):
            return current_dir
        parent_dir = os.path.dirname(current_dir)
        if parent_dir == current_dir:
            return None  # 루트 디렉터리에 도달
        current_dir = parent_dir

# 현재 스크립트 파일의 디렉터리에서 시작
project_root = find_project_root(os.path.dirname(os.path.abspath(__file__)))

if project_root:
    print(f"프로젝트 루트 디렉터리: {project_root}")
else:
    print("프로젝트 루트 디렉터리를 찾을 수 없습니다.")

 

어떤 방법을 선택해야 좋을까?

  • 가장 간단하고 일반적인 경우: os.path.dirname(__file__) 또는 명시적으로 루트 디렉터리를 지정하는 방법을 사용
  • 프로젝트 구조가 복잡하거나 유연성이 필요한 경우: 프로젝트 설정 파일 검색 방법을 사용
반응형