Linux tar - wie Befehle im aktuellen Verzeichnis starten

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
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Servus,

ich denke ich bekomme das so nicht hin:
ich will ein Archiv entpacken, den entstandenen Ordner dann packen und dabei mittels bz2 komprimieren.

Tu ich das auf der Konsole händisch aus dem aktuellen Verzeichnis heraus, da klappt das, aber leider kann ich ja via Python nicht vor dem os.system()-Aufruf nicht sagen: cd dawillichhin ? Wie macht ihr das ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

subprocess.Popen hat ein `cwd` Argument dafuer.
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Puh, sind viele Optionen bei Popen ... mal schauen, ob ich das so hinbekomme, scheint aber genau das zu sein, was ich brauche.
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Code: Alles auswählen

        # Subprocess-Verwendung
        arch_name = "cfa500-1APF_A-178-archive.tar"
        comm = "tar"
        args = " " + "xvf" + " " + arch_name
        wdir = "/home/joba/Desktop/clustereingang/cfa500/tempstorage/"
        p = subprocess.Popen( comm + args, cwd=wdir, shell=True )
        print( "Popen", p )

        input("Weiter mit beliebiger Taste.")
Okay, wie der Name des Moduls schon andeutet scheint es da um Kind-Prozesse zu gehen. Irgendwie schwimmt mir der Prozess weg, ich hätte gerne, dass der Hauptprozess auf den Kindprozess wartet. Aktuell ist es so, dass ich aus dem Entpack-Vorgang nicht mehr zurückkomme, im Hauptthread schlummert aber mein Event-Loop, da wollte ich sicher wieder hinkommen.

Danke vorab für das ein oder andere erläuternde Sätzlein.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Es gibt `subprocess.call` das tut genau das: Den Kindprozess starten und aufs Ende warten. Alternativ hat ein `Popen` Objekt die Methode `wait`.

Und weil du sowieso deinen Aufruf aufbaust und keine Shell brauchst:

Code: Alles auswählen

arch_name = "cfa500-1APF_A-178-archive.tar"
wdir = "/home/joba/Desktop/clustereingang/cfa500/tempstorage/"
p = subprocess.call(["tar",  "xvf", arch_name], cwd=wdir)
Daneben gibts noch das `tempfile` Modul fuer temporaere Verzeichnisse und `tar` kann selbst das Verzeichnis mit der `-C` Option wechseln.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wir haben hier Python-Code-Tags im Forum! Das solltest Du langsam wissen ;-)

Du solltest Dein Kommando nicht so zusammenbauen! Lies doch mal die Doku zu `Popen` und übergib die Sachen als Liste.

Hast Du Dir mal die Funktionen des `subprocess` Moduls angeguckt? Insbesondere `call`? Alternativ auch die Methoden des `Popen`-Objektes.

Als letztes verweise ich noch mal auf das Modul `tarfile` aus der Standardlib. Damit kannst Du die den manuellen Aufruf sparen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten