HOWTO

Cómo obtener el directorio actual de archivos de script en Python

Da el ejemplo de los códigos de cómo obtener la ruta del archivo de script actual

En esta página

Para obtener el directorio que contiene un script de Python en ejecución, use os.path.dirname(os.path.abspath(__file__)) o Path(__file__).resolve().parent. Ambas expresiones parten de __file__, la ruta asociada al script, y obtienen el directorio que lo contiene. Use ese directorio para crear rutas a los archivos guardados junto al script.

Obtener el directorio del script actual

El directorio de un script es la carpeta que contiene su archivo .py. __file__ proporciona la ruta del script; aplicar primero os.path.abspath() y después os.path.dirname() produce una ruta absoluta al directorio. Esto resulta útil cuando un script necesita un archivo de configuración, de entrada o de datos cercano. Si __file__ es relativa, os.path.abspath() la resuelve usando el directorio de trabajo del proceso, por lo que el resultado puede depender de dónde se inició Python. Si __file__ ya es absoluta, ese directorio de trabajo no determina su ubicación.

Ejecute este ejemplo desde un archivo de Python guardado:

Las etiquetas que imprime el ejemplo, «Script directory» y «Directory and filename», permanecen en inglés. El ejemplo muestra el directorio del script y, por separado, el directorio y el nombre del archivo.

import os

script_path = os.path.abspath(__file__)
script_directory = os.path.dirname(script_path)
directory, filename = os.path.split(script_path)

print("Script directory:", script_directory)
print("Directory and filename:", directory, filename)
Script directory: /work
Directory and filename: /work case-0.py

os.path.abspath() convierte la ruta del script en absoluta según el contexto del proceso actual, y os.path.dirname() extrae la parte correspondiente al directorio. os.path.split() devuelve el directorio y el nombre del archivo como valores separados. El directorio impreso dependerá de dónde guarde el archivo, así que no hay una salida literal universal que pueda copiarse.

Diferenciar el directorio del script del directorio de trabajo

El directorio de trabajo es la ubicación del proceso que se usa para resolver rutas relativas, como open("data.csv"). Puede consultarlo con os.getcwd(). Puede ser la carpeta actual de la terminal, una ubicación configurada en un IDE o un directorio elegido por un proceso principal. No tiene por qué ser la carpeta que contiene el script.

En cambio, __file__ se refiere a la ruta del archivo Python que se está ejecutando. Si se inicia un script ubicado en /projects/tool mientras el directorio de trabajo es /tmp, una apertura relativa de data.csv se resolverá desde /tmp; una ruta creada a partir del directorio del script apuntará a /projects/tool. Elija la ubicación base que corresponda al lugar previsto para el archivo. Si el archivo está junto al script, únale su nombre al directorio del script obtenido con os.path.join(script_directory, "data.csv").

Una ruta absoluta derivada de __file__ no garantiza que exista un archivo ni resuelve todos los problemas relacionados con enlaces simbólicos o despliegues. Identifica una ubicación que puede usarse como base; compruebe o abra la ruta resultante según las necesidades de su aplicación.

Usar os.path para obtener el directorio del script

El ejemplo anterior conserva los valores intermedios para que cada operación quede clara. Si solo necesita el directorio que contiene el archivo, combine las llamadas así: os.path.dirname(os.path.abspath(__file__)). Si le interesan ambas partes, conserve el resultado de os.path.split() en lugar de descartar el nombre del archivo.

Para construir la ruta de un archivo ubicado junto al script, use os.path.join() en vez de concatenar cadenas con una barra. Así Python aplica las reglas del separador de rutas de la plataforma. Por ejemplo, os.path.join(script_directory, "settings.json") crea una ruta cuya base es el directorio del script. En cambio, un nombre de archivo relativo que se pase directamente a open() se resolverá desde el directorio de trabajo.

Usar pathlib para obtener el directorio del script

pathlib expresa la misma operación mediante objetos de ruta. En un script guardado, Path(__file__).resolve().parent es el directorio que contiene el archivo: resolve() obtiene una ruta absoluta resuelta y .parent selecciona su carpeta superior. Use / para añadir una ruta secundaria, por ejemplo script_directory / "settings.json", y pase el objeto Path resultante a las API que aceptan objetos compatibles con rutas, incluida open().

La expresión equivalente es Path(__file__).resolve().parent; importe Path desde pathlib antes de usarla. Prefiera pathlib si el código circundante ya usa objetos Path, y os.path si trabaja con rutas de cadena o con API existentes que las esperan. Ninguno de los dos métodos cambia el directorio de trabajo del proceso.

Gestionar notebooks y otros contextos de ejecución

__file__ suele estar definido cuando Python ejecuta un script guardado, pero puede no estarlo en intérpretes interactivos ni en kernels de notebooks. En esos contextos, las expresiones anteriores, basadas en un script, no pueden identificar de forma portable el archivo de un notebook. os.getcwd() sigue indicando el directorio de trabajo del proceso y puede ayudar a localizar archivos con respecto a la ubicación actual del kernel, pero no sustituye la ruta del archivo de origen del notebook.

Si se trata de un archivo que no es el script en ejecución, parta de la ruta conocida de ese archivo en lugar de __file__; después, use os.path.dirname() o .parent del objeto Path para obtener su directorio. Indique claramente el origen de la ruta para que quienes lean el código después puedan saber si corresponde al script, a otro archivo o al directorio de trabajo del proceso.