Errore ensure_dir?

Domande sul packaging WAPT / Richieste e assistenza sui pacchetti Wapt.
Regole del forum
Regole del forum della community
* Supporto in inglese su www.reddit.com/r/wapt
* Supporto della community in francese disponibile su questo forum
* Si prega di anteporre [RISOLTO] al titolo dell'argomento se è stato risolto.
* Si prega di non modificare un argomento contrassegnato con [RISOLTO]. Aprire un nuovo argomento facendo riferimento a quello precedente.
* Specificare la versione di WAPT installata, la versione completa e il numero di build (2.2.1.11957 / 2.2.2.12337 / ecc.) nonché l'edizione Enterprise/Discovery.
* Le versioni 1.8.2 e precedenti non sono più supportate. Le uniche domande accettate relative alla versione 1.8.2 riguardano l'aggiornamento a una versione supportata (2.1, 2.2, ecc.).
* Specificare il sistema operativo del server (Linux/Windows) e la versione (Debian Buster/Bullseye - CentOS 7 - Windows Server 2012/2016/2019).
* Specificare il sistema operativo della macchina di amministrazione/creazione dei pacchetti e della macchina con l'agente problematico, se applicabile (Windows 7/10/11/Debian 11/ecc.).
* Evitare di porre più domande quando si apre una discussione, altrimenti potrebbe essere ignorata. Se ci sono più discussioni, aprirle separatamente, preferibilmente una dopo l'altra e non tutte contemporaneamente (ovvero, non intasare il forum).
* Includere frammenti di codice, screenshot e altre immagini direttamente nel post. I link a Pastebin, Bitly e altri siti di terze parti verranno sistematicamente rimossi.
* Come in qualsiasi forum della community, il supporto è fornito volontariamente dai membri. Se si necessita di supporto commerciale, è possibile contattare il reparto vendite di Tranquil IT al numero 02.40.97.57.55
Bloccato
eritto
Messaggi: 56
Iscrizioni: 22 dicembre 2017 - ore 19:09

22 luglio 2018 - 13:22

Buongiorno,

Versione Wapt 1.5

Ho provato a usare `setuphelper ensure_dir` in un pacchetto e ho riscontrato un malfunzionamento:

In effetti, il comando `ensure_dir('C:\Programmes\Ape')` non ha funzionato. L'ho testato in una console Python con tutte le combinazioni possibili (mettendo "r" prima di 'C:\Programmes...', usando `Programmes` invece di `Programmes`...), ma non ha funzionato nulla.

Quindi ho esaminato il codice della funzione e ho eseguito alcuni test direttamente in Python:
(ovviamente la directory C:\Programmi non esiste)

Codice: Seleziona tutto

>>> ## 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

Nel test 1, vediamo che se `d` è dichiarato come `path.dirname`, la funzione `isdir()` restituisce sempre `True`, anche se il percorso non esiste. (La risposta che ottengo quando chiedo di visualizzare `d` è un po' sorprendente, ma in seguito vediamo che questa non sembra essere la causa del problema, sebbene sia già problematico.)
Nel test 2, vediamo che se d viene dichiarato come stringa e il percorso non esiste, otteniamo effettivamente False.
Nel test 3, vediamo che, d'altro canto, se il percorso esiste quando d è dichiarato come stringa, otteniamo un valore True.

Mi sembra, quindi, che in ensure_dir(), piuttosto che usare

Codice: Seleziona tutto

d = os.path.dirname(filename)
Dovresti usare

Codice: Seleziona tutto

d = filename
In alternativa, è possibile utilizzare direttamente la variabile filename, poiché `d`, in questo caso, non sembra avere molta utilità, se non forse quella di convertire filename in una stringa:

Codice: Seleziona tutto

d = str(filename)
Sinceramente
E. Trezel
eritto
Messaggi: 56
Iscrizioni: 22 dicembre 2017 - ore 19:09

22 luglio 2018 - 17:10

Ciao di nuovo,

Ho spinto le mie indagini un po' più avanti, molto sorpreso di trovare un bug in una funzione che deve essere usata parecchio, e anche dalla visualizzazione della variabile d nel mio test 1, che è in effetti la causa del problema:

Codice: Seleziona tutto

>>> ## Test 1 :
>>> d=path.dirname('C:\program rrr')
>>> d
'C:\\'
>>> path.isdir(d)
True
La risposta di isdir() è logica, poiché d è uguale a C: e C: esiste.
Quindi ho cercato quale/i sintassi fornissero il valore di d che stavo cercando.
Utilizzando i valori "intuitivi" (percorso Windows normale, con o senza "\" alla fine), in realtà non funziona:

Codice: Seleziona tutto


>>> 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: l'aggiunta di 'r' prima del parametro (ad esempio, d = path.dirname(r'C:\ProgramFiles\')) non ha modificato i risultati.
I valori per i quali sono riuscito a far funzionare correttamente questa funzione (da è il valore desiderato e path.isdir() restituisce il valore corretto) sono:

Codice: Seleziona tutto

## 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/')
## 
Questo non è menzionato nella documentazione per ensure_dir() (https://wapt.tranquil.it/wapt/nightly/a ... ensure_dir), e non viene preso in considerazione nel codice, a meno che non mi sia sfuggito qualcosa.
Inoltre non ho trovato nulla nella documentazione per path.dirname() o isdir() sul lato Python.

Spero che questo ti sia d'aiuto...
E.
Bloccato