Seite 1 von 1

Reihenfolge der Befehle

Verfasst: Mittwoch 22. August 2012, 22:28
von captain
Guten Abend,

ich muss mich jetzt an euch wenden, denn ich verweifel bald ;-).

Ich arbeite gerade an einem Backup-Skript, welches erst einige Dateien in einen temporären Ordner kopiert, dann einige Dateien selbst erstellt und schließlich den ganzen temp. Ordner komprimieren soll.
Leider scheine ich einen Fehler zu machen, den ich momentan nicht sehe, denn die vom Skript geschriebenen Dateien werden, anders als die kopierten, nicht richtig komprimiert. Oft sind sie gänzlich leer, manchmal sind die ersten Zeilen enthalten. Im temp. Ordner sind diese übrigens vollständig.
So möchte ich zum Beispiel alle Datenbanken einer MySql-Tabelle sichern:

Code: Alles auswählen

if self.mysql_root_password:
    password = "--password=" + self.mysql_root_password
    with open(backup_dir + '/databases.sql','wb') as file:
        subprocess.Popen( ('mysqldump', '--user=root', password, '-A'), stdout=file )
Wie gesagt, im temp. Ordner ist die Datei vollständig beschrieben enthalten. Nachdem ich den Ordner aber komprimiere ist die Datei oft leer oder enthält die ersten ca. 50 Zeilen (von mehr als 1000).

Folgendermaßen komprimiere ich die Dateien:

Code: Alles auswählen

os.chdir(dir)
with ZipFile(zip_name, 'w') as zip:
    for dirpath, dirnames, filenames in os.walk('./'):
        for filename in filenames:
            zip.write(os.path.join(dirpath, filename))
Anscheinend werden die Dateien komprimiert, bevor sie gänzlich geschrieben werden, denn ein time.sleep(60) brachte abhilfe. Dennoch möchte ich natürlich auf so einen Ansatz verzichten, zumal die Datei auch mehr als 60 Sek. brauchen kann.

Was übersehe ich hier?
Danke schonmal, für jede Art von Hilfe :-)

Re: Reihenfolge der Befehle

Verfasst: Mittwoch 22. August 2012, 22:42
von cofi
Ja `subprocess.Popen` ist asynchron. Du suchst `subprocess.call`.

Re: Reihenfolge der Befehle

Verfasst: Mittwoch 22. August 2012, 22:55
von captain
Ich danke dir vielmals :-). Jetzt funktionierts auch!