Seite 1 von 1

Bug ensure_dir?

Veröffentlicht: 22. Juli 2018 – 13:22 Uhr
von Eric
Guten Morgen,

Wapt Version 1.5

Ich habe versucht, `setuphelper ensure_dir` in einem Paket zu verwenden, und bin dabei auf eine Fehlfunktion gestoßen:

Tatsächlich bewirkte der Befehl `ensure_dir('C:\Programmes\Ape')` nichts. Ich testete ihn in der Python-Konsole mit allen möglichen Kombinationen (z. B. mit einem "r" vor 'C:\Programmes...', mit `Programmes` statt `Programmes`...), aber nichts funktionierte.

Also habe ich mir den Code der Funktion angesehen und einige Tests direkt in Python durchgeführt:
(Das Verzeichnis C:\Program Files existiert natürlich nicht.)

Code: Alle auswählen

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

In Test 1 sehen wir, dass die Funktion `isdir()` immer `True` zurückgibt, wenn `d` als `path.dirname` deklariert wird, selbst wenn der Pfad nicht existiert. (Die Antwort, die ich erhalte, wenn ich die Anzeige von `d` fordere, ist etwas überraschend, aber später sehen wir, dass dies nicht die Ursache des Problems zu sein scheint, obwohl es bereits problematisch ist.)
Im zweiten Test sehen wir, dass wir tatsächlich False erhalten, wenn d als Zeichenkette deklariert wird und der Pfad nicht existiert.
Im dritten Test sehen wir hingegen, dass wir ein True erhalten, wenn der Pfad existiert, während d als Zeichenkette deklariert wird.

Mir scheint daher, dass in ensure_dir(), anstatt zu verwenden

Code: Alle auswählen

d = os.path.dirname(filename)
Sie sollten verwenden

Code: Alle auswählen

d = filename
Alternativ können Sie die Variable `filename` direkt verwenden, da `d` in diesem Fall scheinbar keinen besonderen Zweck erfüllt, außer vielleicht, um `filename` in eine Zeichenkette umzuwandeln:

Code: Alle auswählen

d = str(filename)
Aufrichtig
E. Trezel

Betreff: Bug ensure_dir?

Veröffentlicht: 22. Juli 2018 – 17:10 Uhr
von Eric
Hallo nochmal,

Ich habe meine Untersuchungen noch etwas weitergeführt und war sehr überrascht, einen Fehler in einer Funktion zu finden, die wohl häufig verwendet wird, sowie über die Anzeige der Variable d in meinem Test 1, die tatsächlich die Ursache des Problems ist:

Code: Alle auswählen

>>> ## Test 1 :
>>> d=path.dirname('C:\program rrr')
>>> d
'C:\\'
>>> path.isdir(d)
True
Die Antwort von isdir() ist logisch, da d gleich C: ist und C: existiert.
Also suchte ich nach der Syntax, die den Wert von d lieferte, den ich suchte.
Mit den "intuitiven" Werten (normaler Windows-Pfad, mit oder ohne "\" am Ende) funktioniert es tatsächlich nicht:

Code: Alle auswählen


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

Hinweis: Das Hinzufügen von 'r' vor dem Parameter (z. B. d = path.dirname(r'C:\ProgramFiles\')) hat meine Ergebnisse nicht verändert.
Die Werte, für die ich diese Funktion korrekt zum Laufen gebracht habe (da ist der gewünschte Wert und path.isdir() gibt den korrekten Wert zurück), sind:

Code: Alle auswählen

## 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/')
## 
Dies wird in der Dokumentation für ensure_dir() nicht erwähnt (https://wapt.tranquil.it/wapt/nightly/a ... ensure_dir), und wird im Code nicht berücksichtigt, es sei denn, ich habe etwas übersehen.
Ich habe auch in der Dokumentation zu path.dirname() oder isdir() auf der Python-Seite nichts gefunden.

Hoffentlich hilft das weiter...
UND.