Bug ensure_dir?

Fragen zu WAPT-Paketen / Anfragen und Hilfe bezüglich WAPT-Paketen.
Forumregeln
Community-Forumregeln
* Englischer Support auf www.reddit.com/r/wapt
* Französischer Community-Support ist in diesem Forum verfügbar.
* Bitte kennzeichnen Sie gelöste Themen mit [GELÖST].
* Bitte bearbeiten Sie keine Themen, die mit [GELÖST] markiert sind. Erstellen Sie stattdessen ein neues Thema und verweisen Sie auf das alte.
* Geben Sie die installierte WAPT-Version, die vollständige Versionsnummer und die Build-Nummer (2.2.1.11957 / 2.2.2.12337 / usw.) sowie die Enterprise-/Discovery-Edition an.
* Versionen 1.8.2 und älter werden nicht mehr unterstützt. Fragen zu Version 1.8.2 werden nur beantwortet, wenn sie sich auf ein Upgrade auf eine unterstützte Version (2.1, 2.2 usw.) beziehen.
* Geben Sie das Server-Betriebssystem (Linux/Windows) und die Version (Debian Buster/Bullseye – CentOS 7 – Windows Server 2012/2016/2019) an.
* Geben Sie gegebenenfalls das Betriebssystem des Administrations-/Paketerstellungsrechners und des Rechners mit dem problematischen Agenten an (Windows 7/10/11/Debian 11/etc.).
* Vermeiden Sie es, mehrere Fragen in einem Thema zu stellen, da diese sonst möglicherweise ignoriert werden. Falls mehrere Themen relevant sind, erstellen Sie bitte separate Themen, vorzugsweise nacheinander und nicht gleichzeitig (d. h. vermeiden Sie Spam im Forum).
* Fügen Sie Code-Snippets, Screenshots und andere Bilder direkt in Ihren Beitrag ein. Links zu Pastebin, Bitly und anderen Drittanbieterseiten werden systematisch entfernt.
* Wie in jedem Community-Forum erfolgt die Unterstützung freiwillig durch die Mitglieder. Für kommerziellen Support kontaktieren Sie bitte den Vertrieb von Tranquil IT unter +44 2 40 97 57 55.
Gesperrt
Eric
Nachrichten: 56
Anmeldung: 22. Dezember 2017 – 19:09 Uhr

22. Juli 2018 – 13:22 Uhr

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
Eric
Nachrichten: 56
Anmeldung: 22. Dezember 2017 – 19:09 Uhr

22. Juli 2018 – 17:10 Uhr

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