¿Error en ensure_dir?

Preguntas sobre paquetes WAPT / Solicitudes y ayuda sobre paquetes WAPT.
Reglas del foro
Reglas del foro de la comunidad
* Soporte en inglés en www.reddit.com/r/wapt
* El soporte de la comunidad en francés está disponible en este foro
* Por favor, anteponga [RESUELTO] al título del tema si está resuelto.
* Por favor, no edite un tema que esté etiquetado como [RESUELTO]. Abra un nuevo tema haciendo referencia al anterior.
* Especifique la versión de WAPT instalada, la versión completa y el número de compilación (2.2.1.11957 / 2.2.2.12337 / etc.), así como la edición Enterprise/Discovery.
* Las versiones 1.8.2 y anteriores ya no son compatibles. Las únicas preguntas aceptadas sobre la versión 1.8.2 están relacionadas con la actualización a una versión compatible (2.1, 2.2, etc.).
* Especifique el sistema operativo del servidor (Linux/Windows) y la versión (Debian Buster/Bullseye - CentOS 7 - Windows Server 2012/2016/2019).
* Especifique el sistema operativo de la máquina de administración/creación de paquetes y de la máquina con el agente problemático, si corresponde (Windows 7/10/11/Debian 11/etc.).
* Evite hacer varias preguntas al abrir un tema, ya que podría ser ignorado. Si hay varios temas, ábralos por separado, preferiblemente uno tras otro y no todos a la vez (es decir, no sature el foro con spam).
* Incluya fragmentos de código, capturas de pantalla y otras imágenes directamente en la publicación. Los enlaces a Pastebin, Bitly y otros sitios de terceros serán eliminados sistemáticamente.
* Como en cualquier foro comunitario, el soporte es proporcionado voluntariamente por los miembros. Si necesita soporte comercial, puede comunicarse con el departamento de ventas de Tranquil IT al 02.40.97.57.55.
Bloqueado
ericto
Mensajes: 56
Inscripción: 22 de diciembre de 2017 - 19:09

22 de julio de 2018 - 13:22

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
ericto
Mensajes: 56
Inscripción: 22 de diciembre de 2017 - 19:09

22 de julio de 2018 - 17:10

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.
Bloqueado