IIC2233 / Syllabus-2022-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🚀✨
https://iic2233.ing.puc.cl/
45 stars 40 forks source link

Sobre la utilización de 'os.path', 'sys.path' e importación de módulos #182

Closed Daniel-Guajardo closed 2 years ago

Daniel-Guajardo commented 2 years ago

Me asalta una duda.

Revisando, encontré que puedo emplear os.path.abspath(__file__) para obtener la ruta absoluta del archivo que está ejecutando esta instrucción. De esta forma, si la ubicación del archivo cambia, entonces su ruta absoluta también cambiaría.

También vi que puedo emplear os.path.split(ruta) para obtener una tupla de dos elementos en la que el primer elemento es la ruta anterior sin el último elemento de la cola, y el segundo elemento es el elemento final de la cola (tanto para ruta absoluta como relativa). Por ejemplo, algo parecido a esto:

ruta = "Carpeta1\Carpeta2\Carpeta3"

os.path.split(ruta) = ("Carpeta1\Carpeta2", "Carpeta3")

De este modo, puedo obtener una forma (quizá no muy elegante) de moverme entre rutas a partir de la ruta en la que se ubique el archivo (o módulo) que esté ejecutando, además de que el empleo de estas rutas absolutas "condicionales" (llamémosles así) evitarían los conflictos usuales que supondría el empleo de rutas absolutas.

Punto aparte, también vi que podemos emplear sys.path.append(ruta) para, por así decirlo, agregar una ruta dentro de la cuál el archivo puede buscar módulos para ser importados, de forma de poder conseguir importar módulos desde otras carpetas.

Estaba notando que emplear particularmente la ruta relativa ".." para buscar en la carpeta anterior podría funcionar, pero el problema es que esta ruta hace referencia no a la carpeta que contiene a la carpeta que contiene el archivo, sino que hace referencia a la carpeta que contiene a la carpeta desde la cuál ejecuté el editor (la ruta ".." es diferente si abro el editor desde la carpeta T2 a si la abro desde la carpeta Tareas a pesar de ejecutarse en el mismo archivo).

El problema podría resolverse (al menos para no generar conflictos) empleando sys.path.append(ruta) siendo ruta una ruta absoluta obtenida de os.path.abspath(file) y una combinación de os.path.split(ruta) y os.path.join(arg1, arg2, ...), para luego poder importar algún módulo requerido que se ubique en ruta.

Mi duda es: ¿Estaría permitido emplear el método que acabo de exponer para lograr realizar la importación de módulos?

Saludos

PD: Ciertamente en otro apartado sugirieron que era buena idea importar todo al archivo main.py y desde ahí agregar como argumentos a las demás clases, pero quisiera ver si me es posible probar esta alternativa.

Emiliax16 commented 2 years ago

Hola @Daniel-Guajardo ! Lamentablemente el comando os.path.abspath(__file__) cuenta como utilizar rutas absolutas y su uso está prohibido. Por lo que lo mejor es seguir lo que dije en la issue #158 . Saludos.