HOWTO · Python

Python의 상대 경로

Python의 절대 경로와 상대 경로가 어떻게 동작하는지, 기준 디렉터리가 경로 해석에 어떤 영향을 주는지, 표준 라이브러리로 경로를 구성하는 방법을 알아보세요.

이 페이지의 내용

상대 경로는 기준 디렉터리를 바탕으로 해석되며, 이 기준은 보통 프로세스의 현재 작업 디렉터리입니다. 상대 경로가 자동으로 Python 스크립트의 위치를 기준으로 삼는 것은 아닙니다. 기준 디렉터리와 관계없이 같은 위치를 가리켜야 한다면 절대 경로를 사용하고, 상대 경로를 만들 때는 기준을 직접 정하세요.

Python의 파일 경로

파일 경로는 디렉터리 이름과 파일 이름으로 이루어집니다. 예를 들어 C:\\PythonProjects\\Tutorials\\Paths\\paths.py는 C: 드라이브 아래에 있는 스크립트를 가리킵니다. Windows 경로에는 보통 백슬래시(\\)가, macOS와 Linux 경로에는 보통 슬래시(/)가 표시됩니다. 이 문자는 파일 시스템의 구분자입니다. Python 문자열 리터럴에서는 백슬래시가 이스케이프 시퀀스의 시작일 수도 있습니다. Windows 경로를 문자열로 쓸 때는 raw 문자열이나 슬래시를 사용하거나, os.path.join()으로 경로를 만들어 Python이 플랫폼에 맞는 구분자를 선택하게 하세요.

예제에서는 Tutorials 아래에 Paths와 Strings라는 형제 디렉터리가 있다고 가정합니다. paths.py는 Paths에 있고 string.py는 Strings에 있습니다.

Windows, Mac, Linux의 차이

Windows 경로는 C:\\PythonProjects\\Tutorials\\Paths\\paths.py처럼 표시될 수 있고, POSIX 경로는 /home/ava/Tutorials/Paths/paths.py처럼 표시될 수 있습니다. 구분자는 다르지만 Python의 경로 유틸리티는 각 플랫폼에 맞는 형식을 처리합니다. Python 문자열로 경로를 작성할 때는 문자열 리터럴 규칙도 따라야 하므로 r"C:\\PythonProjects\\Tutorials", "C:/PythonProjects/Tutorials" 또는 os.path.join()에 전달하는 경로 구성 요소를 사용하는 편이 좋습니다.

현재 작업 디렉터리

현재 작업 디렉터리(cwd)는 특정 파일이 아니라 실행 중인 프로세스에 속합니다. os.getcwd()는 이 디렉터리를 반환합니다. Strings/string.py 같은 상대 경로는 cwd를 기준으로 해석되므로 cwd가 바뀌면 같은 상대 경로가 가리키는 위치도 달라집니다. os.chdir()는 프로세스 전체의 cwd를 바꾸며, 같은 프로세스의 다른 코드에도 영향을 줄 수 있습니다. 스크립트와 애플리케이션에서는 cwd를 바꾸는 대신 기준 디렉터리를 명시하는 편이 이해하기 쉽습니다.

절대 경로

절대 경로는 파일 시스템의 루트(Windows에서는 드라이브)를 기준으로 위치를 지정합니다. 실행 중인 스크립트에서 __file__을 사용할 수 있다면, 일반적으로 스크립트 파일로 실행할 때처럼 os.path.abspath(__file__)로 스크립트 경로를 절대 경로 형태로 만들 수 있습니다. 이는 임의의 상대 경로를 해석하는 것과 다릅니다. 임의의 상대 경로는 보통 프로세스의 cwd를 기준으로 해석됩니다.

예를 들어 cwd가 C:\\PythonProjects\\Tutorials라면, 형제 디렉터리에 있는 파일 Strings\\string.py는 절대 경로 C:\\PythonProjects\\Tutorials\\Strings\\string.py로 지정할 수 있습니다. 절대 경로는 해당 컴퓨터에서 위치를 명확하게 가리키지만 프로젝트를 다른 위치로 옮기면 수정해야 하는 경우가 많습니다.

Python에서 string.py의 절대 경로 구성하기

절대 경로를 구성하려면 파일 시스템의 루트에서 시작해 디렉터리와 파일 이름을 결합합니다. os.path.abspath()는 현재 컴퓨터에서 결과를 절대 경로로 만듭니다. 경로를 구성한다고 파일이 생성되는 것은 아닙니다. 예제에서는 구성한 경로가 절대 경로인지 확인할 뿐입니다.

import os
root = os.path.abspath(os.sep)
absolute_path = os.path.abspath(
    os.path.join(root, "Tutorials", "Strings", "string.py")
)
print(os.path.isabs(absolute_path))
True

상대 경로

상대 경로는 지정한 기준 위치에서 목적지까지의 위치를 나타냅니다. 일반적인 Python 프로그램에서는 기준이 현재 작업 디렉터리인 경우가 많지만, 프로그램이 선택한 디렉터리를 기준으로 삼을 수도 있습니다. 기준을 명확히 해야 합니다. cwd가 Tutorials일 때와 Tutorials/Paths일 때 Strings/string.py가 가리키는 위치는 서로 다릅니다.

cwd가 C:\\PythonProjects\\Tutorials라면 형제 디렉터리에 있는 파일의 경로는 Strings\\string.py입니다. cwd가 C:\\PythonProjects\\Tutorials\\Paths라면 같은 파일에 ..\\Strings\\string.py로 도달할 수 있으며, 여기서 ..은 부모 디렉터리를 뜻합니다. os.path.join()을 사용하면 구분자를 직접 고정하지 않고 경로 구성 요소를 결합할 수 있습니다. 스크립트 디렉터리를 기준으로 상대 경로를 해석하려면 __file__에서 해당 디렉터리를 구해 명시적인 기준으로 사용하세요. 이렇게 하면 프로그램을 어느 디렉터리에서 실행하든 코드와 함께 있는 리소스를 찾을 수 있습니다.

예를 들어 스크립트 디렉터리에서 시작해 부모 디렉터리인 Tutorials로 이동한 다음 Strings와 string.py를 덧붙일 수 있습니다. 이렇게 하면 프로세스 cwd가 아니라 스크립트 위치를 기준으로 경로가 만들어집니다. os.path.abspath()로 결과를 절대 경로 형태로 바꿀 수도 있습니다. 이 예제의 디렉터리 구조에서는 Paths와 Strings가 형제 디렉터리라고 가정합니다. 프로젝트 구조가 다르면 경로 구성 요소를 조정하세요.

Python에서 Paths에서 Strings로 가는 상대 경로 구성하기

Tutorials/Paths에서 Tutorials/Strings/string.py까지의 경로를 구하려면 두 위치를 os.path.relpath()에 전달합니다. start 인수로 Paths를 명시적인 기준으로 지정하므로, 이 구조에서 결과 상대 경로는 ../Strings/string.py입니다. 이 함수는 전달된 이름을 바탕으로 경로 문자열을 계산합니다. 프로세스 cwd를 바꾸거나 목적지의 존재 여부를 확인하거나 파일에 접근하지는 않습니다. 결과를 다른 기준에서 해석하면 다른 위치를 가리킵니다.

예제에서는 공통 디렉터리 구조를 나타내는 상대 이름을 사용합니다. os.path.relpath()는 이름을 문자열상으로 비교하므로 계산을 위해 디렉터리와 파일이 실제로 존재할 필요는 없습니다.

import os

paths = os.path.join("Tutorials", "Paths")
string_file = os.path.join("Tutorials", "Strings", "string.py")
relative_path = os.path.relpath(string_file, start=paths)
print(relative_path.replace(os.sep, "/"))

프로세스 cwd를 바꾸려면 os.chdir()를 참조하세요. 프로세스 cwd를 확인하려면 os.getcwd()를 참조하세요. 한국어 대상 페이지는 현재 제공되지 않아 두 링크가 영어 페이지로 연결됩니다.