subprocess & tar

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.
Antworten
Matthias81
User
Beiträge: 4
Registriert: Freitag 20. Juni 2014, 09:05

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
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Liegt sicher am Leerzeichen vor dem Asterisk.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Matthias81
User
Beiträge: 4
Registriert: Freitag 20. Juni 2014, 09:05

Code: Alles auswählen

subprocess.check_call("tar -cvzf ../archive2.tar.gz\x20*".split())
Die Escapesequenz hilft auch nicht.
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Matthias81
User
Beiträge: 4
Registriert: Freitag 20. Juni 2014, 09:05

Danke für die Erklärung.
Antworten