HOWTO · Python

Ruta relativa en Python

Aprende cómo funcionan las rutas absolutas y relativas en Python, cómo su directorio base afecta a la resolución y cómo construir rutas con la biblioteca estándar.

En esta página

Una ruta relativa se interpreta desde un directorio base, que suele ser el directorio de trabajo actual del proceso. No implica automáticamente una ruta relativa al script de Python. Usa una ruta absoluta si quieres que la ubicación no dependa de esa base, o crea una ruta relativa a partir de la base que elijas.

Ruta de archivo en Python

Una ruta de archivo se compone de nombres de directorios y un nombre de archivo. Por ejemplo, C:\\PythonProjects\\Tutorials\\Paths\\paths.py identifica un script dentro de la unidad C:. Las rutas de Windows suelen mostrarse con barras invertidas (\\), mientras que las de macOS y Linux suelen usar barras (/). Son separadores del sistema de archivos; en los literales de cadena de Python, las barras invertidas también pueden introducir secuencias de escape. Para escribir rutas de Windows, usa cadenas sin procesar o barras normales; también puedes construirlas con os.path.join(), que selecciona el separador de la plataforma.

Los ejemplos usan esta estructura: Tutorials contiene los directorios hermanos Paths y Strings; paths.py está en Paths y string.py, en Strings.

Diferencias entre Windows, Mac y Linux

Una ruta de Windows podría mostrarse así: C:\\PythonProjects\\Tutorials\\Paths\\paths.py; una ruta POSIX, así: /home/ava/Tutorials/Paths/paths.py. Los separadores son distintos, pero las utilidades de rutas de Python manejan el formato propio de cada plataforma. Las rutas escritas como cadenas de Python también deben respetar las reglas de los literales de cadena. Por eso, conviene usar r"C:\\PythonProjects\\Tutorials", "C:/PythonProjects/Tutorials" o pasar los componentes a os.path.join().

Directorio de trabajo actual

El directorio de trabajo actual (cwd) pertenece al proceso en ejecución, no a un archivo concreto. os.getcwd() devuelve ese directorio. Una ruta relativa como Strings/string.py se resuelve desde el cwd; si este cambia, también cambia la interpretación de esa misma ruta. os.chdir() modifica el cwd de todo el proceso, lo que puede afectar a otras partes del programa. En scripts y aplicaciones, suele ser más fácil razonar sobre una base explícita que cambiar el cwd.

Ruta absoluta

Una ruta absoluta identifica una ubicación desde la raíz del sistema de archivos (o desde una unidad en Windows). Para un script en ejecución, os.path.abspath(__file__) devuelve una forma absoluta de la ruta del script cuando __file__ está disponible, como suele ocurrir al ejecutar un archivo como script. Esto difiere de resolver una ruta relativa cualquiera, que normalmente se interpreta desde el cwd del proceso.

Por ejemplo, si el cwd es C:\\PythonProjects\\Tutorials, el archivo Strings\\string.py puede identificarse con la ruta absoluta C:\\PythonProjects\\Tutorials\\Strings\\string.py. Las rutas absolutas no son ambiguas en esa máquina, pero a menudo hay que adaptarlas si el proyecto se traslada a otra ubicación.

Crear una ruta absoluta a string.py en Python

Para crear una ruta absoluta, parte de la raíz del sistema de archivos y une los nombres de los directorios y del archivo. os.path.abspath() convierte el resultado en una ruta absoluta para la máquina actual. Construir una ruta no crea el archivo; el ejemplo solo comprueba que la ruta construida sea absoluta.

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

Ruta relativa

Una ruta relativa identifica una ubicación a partir de una base especificada. En los programas cotidianos de Python, la base suele ser el directorio de trabajo actual, pero también puede ser un directorio elegido por el programa. Es importante tener clara la base: Strings/string.py apunta a un lugar si el cwd es Tutorials y a otro si es Tutorials/Paths.

Si el cwd es C:\\PythonProjects\\Tutorials, la ruta al archivo del directorio hermano es Strings\\string.py. Si el cwd es C:\\PythonProjects\\Tutorials\\Paths, se llega al mismo archivo con ..\\Strings\\string.py, donde .. representa el directorio superior. os.path.join() puede combinar estos componentes sin fijar manualmente un separador. Para resolver una ruta relativa desde el directorio del script, obtén ese directorio a partir de __file__ y úsalo como base explícita. Esto resulta útil cuando el programa debe localizar recursos junto a su código, independientemente del directorio desde el que se ejecute.

Por ejemplo, parte del directorio del script, sube a su directorio superior (Tutorials) y añade Strings y string.py. Así se construye una ruta basada en la ubicación del script y no en el cwd del proceso. os.path.abspath() puede convertir el resultado en una ruta absoluta. La estructura del ejemplo supone que Paths y Strings son directorios hermanos; adapta los componentes si la organización de tu proyecto es distinta.

Crear una ruta relativa de Paths a Strings en Python

Para indicar la ruta desde Tutorials/Paths hasta Tutorials/Strings/string.py, pasa ambas ubicaciones a os.path.relpath(). El argumento start establece Paths como base explícita, así que en esta estructura la ruta relativa resultante es ../Strings/string.py. La función calcula una cadena de ruta a partir de los nombres proporcionados: no cambia el cwd del proceso, comprueba si existe el destino ni accede al archivo. Si resuelves el resultado desde otra base, señalará una ubicación distinta.

El ejemplo usa nombres relativos para representar la estructura de directorios compartida. os.path.relpath() los compara léxicamente, por lo que los directorios y el archivo no necesitan existir para realizar este cálculo.

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, "/"))

Para cambiar el cwd del proceso, consulta os.chdir(). Para consultar el cwd del proceso, consulta os.getcwd(). No hay destinos localizados en español para estas páginas, así que se conservan los enlaces en inglés.