Pagina 1 di 1

Errore ensure_dir?

Pubblicato: 22 luglio 2018 - 13:22
di Eric
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

Re: Bug ensure_dir?

Pubblicato: 22 luglio 2018 - 17:10
di Eric
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.