Seite 1 von 1

subprocess & tar

Verfasst: Freitag 20. Juni 2014, 09:10
von Matthias81
Hallo,

ich versuche über subprocess.check_call() tar aufzurufen:

Code: Alles auswählen

#! /usr/bin/env python3

import subprocess

subprocess.check_call("tar -cvzf ../archive1.tar.gz *", shell=True)
subprocess.check_call("tar -cvzf ../archive2.tar.gz *".split())
Bei der 2. Variante welche ich eigentlich verwenden möchte, bekomme ich folgende Fehlermeldung bzw. Ausgaben:

Code: Alles auswählen

tar: *: Funktion stat fehlgeschlagen: Datei oder Verzeichnis nicht gefunden
tar: Beende mit Fehlerstatus aufgrund vorheriger Fehler
Traceback (most recent call last):
  File "./tartest.py", line 6, in <module>
    subprocess.check_call("tar -cvzf ../archive2.tar.gz *".split())
  File "/usr/lib/python3.4/subprocess.py", line 561, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['tar', '-cvzf', '../archive2.tar.gz', '*']' returned non-zero exit status 2
Worin liegt das Problem bei der 2.Variante?
Mit anderen Kommando's funktionert es ohne Probleme.

Viele Grüße,
Matthias

Re: subprocess & tar

Verfasst: Freitag 20. Juni 2014, 09:23
von darktrym
Liegt sicher am Leerzeichen vor dem Asterisk.

Re: subprocess & tar

Verfasst: Freitag 20. Juni 2014, 09:32
von Matthias81

Code: Alles auswählen

subprocess.check_call("tar -cvzf ../archive2.tar.gz\x20*".split())
Die Escapesequenz hilft auch nicht.

Re: subprocess & tar

Verfasst: Freitag 20. Juni 2014, 09:48
von Sirius3
@Matthias81: die Shell ersetzt Wildcards durch die entsprechenden Dateinamen. Bei einem '*' werden also alle Dateien im aktuellen Verzeichnis als Argumente an 'tar' übergeben. Im zweiten Fall wird einfach ein '*' als Argument übergeben. Um also den gleichen Aufruf zu bekommen, mußt Du also die Dateien selbst mit 'listdir' ermitteln.

Re: subprocess & tar

Verfasst: Freitag 20. Juni 2014, 11:06
von Matthias81
Danke für die Erklärung.