Página 1 de 1

¿Error en ensure_dir?

Publicado: 22 de julio de 2018 - 13:22
por Eric
Buen día,

Versión 1.5 de Wapt

Intenté usar `setuphelper ensure_dir` en un paquete y encontré un mal funcionamiento:

De hecho, el comando `ensure_dir('C:\Programmes\Ape')` no funcionó. Lo probé en una consola de Python con todas las combinaciones posibles (antes de 'C:\Programmes...', usando `Programmes` en lugar de `Programmes`...) y nada funcionó.

Entonces, miré el código de la función y ejecuté algunas pruebas directamente en Python:
(por supuesto el directorio C:\Archivos de programa no existe)

Código: Seleccionar todo

>>> ## Test 1 :
>>> d=path.dirname('C:\program rrr')
>>> d
'C:\\'
>>> path.isdir(d)
True

>>> ## Test 2 :
>>> d="C:\Program rrr"
>>> d
'C:\\Program rrr'
>>> path.isdir(d)
False

>>> ##Test 3 :
>>> d="C:\Program Files"
>>> d
'C:\\Program Files'
>>> path.isdir(d)
True

En la prueba 1, observamos que si `d` se declara como `path.dirname`, la función `isdir()` siempre devuelve `True`, incluso si la ruta no existe. (La respuesta que obtengo al solicitarle que muestre `d` es un poco sorprendente, pero más adelante vemos que esta no parece ser la causa del problema, aunque ya lo es)
En la prueba 2, vemos que si d se declara como una cadena y la ruta no existe, efectivamente obtenemos Falso.
En la prueba 3, vemos que, por otro lado, si la ruta existe cuando d se declara como una cadena, obtenemos un Verdadero.

Por lo tanto, me parece que en ensure_dir(), en lugar de utilizar

Código: Seleccionar todo

d = os.path.dirname(filename)
Deberías usar

Código: Seleccionar todo

d = filename
O bien, puede utilizar directamente la variable filename, ya que `d`, en este caso, no parece tener mucha utilidad, excepto quizás para convertir filename en una cadena:

Código: Seleccionar todo

d = str(filename)
Atentamente
E. Trezel

Re: Error en ensure_dir?

Publicado: 22 de julio de 2018 - 17:10
por Eric
Hola de nuevo,

Profundicé un poco más en mis investigaciones, muy sorprendido de encontrar un error en una función que se debe utilizar bastante, y también por la visualización de la variable d en mi prueba 1, que de hecho es la causa del problema:

Código: Seleccionar todo

>>> ## Test 1 :
>>> d=path.dirname('C:\program rrr')
>>> d
'C:\\'
>>> path.isdir(d)
True
La respuesta de isdir() es lógica, ya que d es igual a C:, y C: existe.
Entonces busqué qué sintaxis daba el valor de d que era el que estaba buscando.
Usando los valores "intuitivos" (ruta normal de Windows, con o sin "\" al final), en realidad no funciona:

Código: Seleccionar todo


>>> d = path.dirname('C:\Program Files')
>>> d
'C:\\'

>>> d = path.dirname('C:\ProgramFiles\')
	File "<stdin>", line 1
		d = path.dirname('C:\ProgramFiles\')
									^
SyntaxError:  EOL while scanning string literal

Nota: Agregar 'r' antes del parámetro (por ejemplo, d = path.dirname(r'C:\ProgramFiles\')) no cambió mis resultados.
Los valores para los cuales logré que esta función funcionara correctamente (da es el valor deseado y path.isdir() devuelve el valor correcto) son:

Código: Seleccionar todo

## Chemin Windows "normal", et on échappe le dernier "\" :
d = path.dirname('C:\Program Files\\')
## Chemin Windows "normal", et on ajoute un espace après le dernier "\" :
d = path.dirname('C:\Program Files\ ')
## Chemin Windows "normal", et on remplace le dernier "\" par un "/" :
d = path.dirname('C:\Program Files/')
## Chemin style "Linux", avec des "/" et non des "\" (et "/" à la fin obligatoire) :
d = path.dirname('C:/Program Files/')
## 
Esto no se menciona en la documentación de ensure_dir() (https://wapt.tranquil.it/wapt/nightly/a ... asegurar_dir), y no se tiene en cuenta en el código, a menos que me haya perdido algo.
Tampoco encontré nada en la documentación para path.dirname() o isdir() en el lado de Python.

Ojalá esto ayude...
Y.