Anleitung 4: Verzeichnisersteller (quickmkdir)
Diese Anleitung erstellt quickmkdir, ein minimales mkdir-ähnliches Werkzeug, das
einen oder mehrere Verzeichnisse in einem Aufruf erzeugt. Du lernst, mit einer
wiederholbaren Option zusätzliche Pfade zu sammeln und sie mit dem primären Argument
zu kombinieren.
Du lernst:
- neben einem primären Pfad zusätzliche Pfade über eine wiederholbare Option zu akzeptieren
- Pfade, die noch nicht existieren, mit
directory_path(exists=None)zu validieren - für
mkdir-Verhalten die Flags--parentsund--exist-okzu verwenden
Das vollständige Beispiel
Speichere die folgende Datei als quickmkdir.py:
from __future__ import annotations
from pathlib import Path
from quickli import Application, Argument, Option, directory_path
app = Application(
name="quickmkdir",
description="A tiny mkdir-like CLI built with quickli.",
global_options=[
Option("verbose", short_name="v", is_flag=True, help_text="Print created directories."),
],
)
@app.entrypoint(
help_text="Create one or more directories.",
arguments=[Argument("path", validators=[directory_path(exists=None)])],
options=[
Option(
"extra",
short_name="e",
multiple=True,
validators=[directory_path(exists=None)],
help_text="Create additional directories in the same call.",
),
Option("parents", short_name="p", is_flag=True, help_text="Create parent directories."),
Option("exist-ok", is_flag=True, help_text="Ignore existing directories."),
],
)
def create(
path: Path,
extra: list[Path] | None = None,
parents: bool = False,
exist_ok: bool = False,
verbose: bool = False,
) -> str:
paths = [path, *(extra or [])]
for item in paths:
item.mkdir(parents=parents, exist_ok=exist_ok)
if not verbose:
return "created"
return "\n".join(f"created: {item}" for item in paths)
if __name__ == "__main__":
print(app.run())
Ausführen
# Ein einzelnes Verzeichnis erstellen
python quickmkdir.py new-folder
# Mehrere Verzeichnisse erstellen
python quickmkdir.py dist -e logs -e tmp
# Mit übergeordneten Verzeichnissen erstellen
python quickmkdir.py a/b/c --parents
# Erstellte Verzeichnisse anzeigen
python quickmkdir.py output --verbose
# Bereits vorhandene Verzeichnisse stillschweigend ignorieren
python quickmkdir.py output --exist-ok
Erklärung Zeile für Zeile
Pfade validieren, die noch nicht existieren dürfen
Argument("path", validators=[directory_path(exists=None)])
directory_path(exists=None) überspringt die Existenzprüfung. Der Validator prüft nur,
ob der Wert ein syntaktisch gültiger Pfad ist. Das ist hier passend, weil wir das
Verzeichnis erstellen — es darf noch nicht existieren, außer --exist-ok wird verwendet.
Mehrere Pfade sammeln
Option(
"extra",
short_name="e",
multiple=True,
validators=[directory_path(exists=None)],
help_text="Create additional directories in the same call.",
),
multiple=True sammelt alle Werte von --extra beziehungsweise -e in einer Liste.
Jeder Wert wird einzeln durch directory_path(exists=None) validiert.
Pfade im Handler kombinieren
paths = [path, *(extra or [])]
for item in paths:
item.mkdir(parents=parents, exist_ok=exist_ok)
Der Handler kombiniert den primären Pfad und die zusätzlichen Pfade in einer Liste und
erstellt anschließend jedes Verzeichnis. extra or [] schützt vor None, wenn keine
--extra-Werte angegeben wurden.
Optionsname mit Bindestrich
Option("exist-ok", is_flag=True, help_text="Ignore existing directories."),
Auf Optionen mit Bindestrichen (exist-ok) wird im Handler über Parameter mit
Unterstrichen (exist_ok) zugegriffen. quickli wandelt Namen mit Bindestrichen
automatisch in Namen mit Unterstrichen um.
Was du als Nächstes ausprobieren kannst
- Füge eine Option
--modehinzu, die eine Unix-Berechtigungszeichenkette (zum Beispiel755) akzeptiert und anPath.mkdirübergibt. - Lies Anleitung 5: Dateikopf, um numerische Konvertierung und Bereichsvalidierung kennenzulernen.
