Pfad wärend Lauf eines Skriptes ändern

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
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Sonntag 25. Mai 2008, 20:37

Hallo Pythonfreunde,

ich habe gerade ein kleines Problem mit meinem Script. "tar" unter Linux gibt ienen fehler aus wenn man absolute Pfade verwendet (tar: Entferne führende „/“ von Elementnamen).
daher wechsle ich in meinem Script mit "cd /" auf root. So würde es auch funktionieren, aber das scheint wärend des Scriptlaufs nciht möglich zu sein und ich bekomme immer noch die Fehlermeldung :
"tar: etc: Kann stat nicht ausführen: No such file or directory"

hier das Script:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

import os
backupdirs = [  #die führenden "/" wurden bewußt weggelassen um die Fehlermeldung
                # "tar: Entferne führende „/“ von Elementnamen" zu vermeiden
                #'home/alpha/EigeneDateien',
                'home/alpha/.mozilla',
                #'home/alpha/.evolution',
                'etc'
             ]
backupsafe = "/home/alpha/backup"            

# ins Rootverzeichnis wechseln
expression = "cd /"
ret = os.system(expression)
print ret

# Tar-Datei erstellen             
for backupdir in backupdirs:
    expression = "tar rfv " + "/home/alpha/backup/backup.tar " + backupdir + " > /dev/null"
    print expression
    ret = os.system(expression)
    if ret == 0:
        print (backupdir + ": Erfolgreich zur Backupdatei hinzugefügt")
    else:
        print (backupdir + ": konnte nicht zur Backupdatei hinzugefügt werden")

# Tar-Dateie komprimieren
print "tar Datei erzeugt... beginne mit Komprimierung:"
expression = "bzip2 -9v " + backupsafe + "/backup.tar"
ret = os.system(expression)
if ret == 0:
    print ("Datei erfolgreich komprimiert")
else:
    print ("Fehler beim komprimieren")

Code: Alles auswählen

expression = "cd /"
ret = os.system(expression)
print ret
Das scheint nicht zu funktionieren. Hat jemand eine Lösung für das Problem?

Gruß
alpha
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 25. Mai 2008, 20:45

Auszug aus der os-Doku:
system( command)
Execute the command (a string) in a subshell. This is implemented by calling the Standard C function system(), and has the same limitations. Changes to posix.environ, sys.stdin, etc. are not reflected in the environment of the executed command.
chdir(...)
chdir(path)

Change the current working directory to the specified path.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Sonntag 25. Mai 2008, 20:48

Und die Nutzung von ``[mod]subprocess[/mod].Popen`` ist IMHO auch empfehlenswert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 25. Mai 2008, 22:14

``subprocess.Popen`` kennt das Argument ``cwd`` mit dem man den Anzuspringenden Pfad angeben kann. Aber das ist gar nicht nötig, denn (zumindest GNU) tar versteht den Parameter ``-C``. Einfach mal in die Manpage gucken.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Montag 26. Mai 2008, 10:36

Bei der Nutzung von os.system musst du quoten, oder hat dein ``backupdir`` nie Leerzeichen?

Wenn du unbedingt Unterprozesse nutzen möchtest, dann mit subprocess (ohne shell=True ;) ), dass erspart Quoting und Probleme mit dem Rückgabewert.

Ich möchte an dieser Stelle allerdings auch darauf hinweisen, dass die Standardbibliothek ein Modul zum Auslesen und Erstellen von tar-Archiven mitbringt, dessen Benutzung in diesem Fall sicherlich empfehlenswert wäre. ;)
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Freitag 30. Mai 2008, 09:11

Danke für die vielen Tips und Hinweise.
Das Modul Tarfile muss ich mir mal anschauen :)

Grüße
alpha
Antworten