Liste mit Dateinamen (ls *.ext)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Donnerstag 7. Mai 2009, 10:23

Gehört nicht direkt zur Fragestellung, aber:
Einem Skript möchte ich als Argument Dateien mit Wildcard verklickern, z.B.:

Code: Alles auswählen

script.py *.ext
Dann wäre es ein Leichtes, mit glob(argv[1]) die Liste zu bekommen.

Leider passiert in meiner Shell aber folgendes nicht:

Code: Alles auswählen

argv[1] >> '*.ext'
argv[1] >> 'file1.ext file2.ext ...'
sondern

Code: Alles auswählen

argv[1] >> 'file1.ext'
Was genau passiert da und wie vermeidet man es?
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 7. Mai 2009, 10:39

*.ext wird zunächst von deiner Shell bearbeitet und damit natürlich durch die entsprechenden Dateien ersetzt. Versuch einfach mal:

Code: Alles auswählen

script.py "*.ext"
Das Leben ist wie ein Tennisball.
lunar

Donnerstag 7. Mai 2009, 10:48

Das ist doch unsinnig. Zum einen dupliziert man damit die Arbeit der Shell, zumal diverse Shells wie die zsh weitaus mächtigere Globbing-Features bereitstellen als die "glob()" -Funktion. Zum anderen erschwert man das Escaping: Angenommen, der Nutzer hat eine Datei mit einem Sternchen im Namen. Ruft man "glob()" nochmals manuell auf, muss der Nutzer zweimal Escapen, das erste Mal, um die Shell am Globbing zu hindern, das zweite Mal, um das Programm daran zu hindern.

"glob()" manuell aufzurufen, führt nur zu für den Benutzer unerwarteten Effekten. Anstatt manuell zu globben und der Shell damit ins Handwerk zu pfuschen, sollte man sie einfach ihre Arbeit tun lassen und einfach mit mit der sys.argv()-Liste arbeiten.
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Donnerstag 7. Mai 2009, 11:11

Danke, habe mein Problem erkannt:
* wird von der Shell zu "file1 file2 file3" umgebaut - argv >> ['file1', 'file2' ,'file3']
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Donnerstag 7. Mai 2009, 12:51

Hyperion hat geschrieben:

Code: Alles auswählen

rm -r /home/irgendwas/nochwas/ *
Oh ja... :roll:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 7. Mai 2009, 14:43

whaeva hat geschrieben:Danke, habe mein Problem erkannt:
* wird von der Shell zu "file1 file2 file3" umgebaut - argv >> ['file1', 'file2' ,'file3']
Nicht jede Shell. Bei DOS und ich denke auch dass es in Windows so ist, müssen die Programme selbst 'glob'ben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten