os.system Befehl für iterierbares Objekt

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
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

Sonntag 20. April 2008, 13:29

Hallo zusammen,
nach langem rumprobieren und auch Suchen hier im Forum stehe ich immer noch vor einem ziemlich doofen Problem, was wohl für die meisten hier kein Problem sein wird.

ich möchte gerne rpm Pakete aus verschiedenen Verzeichnissen erstellen lassen und muss wie so üblich erst einmal tar Archive erstellen, aber da fängts schon an:

in

Code: Alles auswählen

#!/usr/bin/env python
#coding:utf-8

import os
import sys

rpmbuild = "/usr/src/redhat/RPMS/noarch/"
rpmpath = "/usr/src/custom/cluster/"
for root, dirs, files in os.walk(rpmpath):
    for rpmdir in dirs:
        os.system("/usr/bin/tar pczf rpmbuild/rpmdir.tgz rpmdir" )

dabei wird lediglich immer nur eine Datei rpmdir.tgz angelegt. Ich habe bereits mit Hochkommata gearbeitet, rpmbuild und rpmdir aus den Anführungszeichen gelassen, aber immer nur Fehlermeldungen erhalten, was mache ich falsch?
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Sonntag 20. April 2008, 13:41

Arbeite mit [mod]tarfile[/mod]
dann wäre es sogar platformunabhängig (wie weit das sinn macht ist fragwürdig :) )
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 20. April 2008, 15:11

oblivion hat geschrieben:

Code: Alles auswählen

#!/usr/bin/env python
#coding:utf-8

import os
import sys

rpmbuild = "/usr/src/redhat/RPMS/noarch/"
rpmpath = "/usr/src/custom/cluster/"
for root, dirs, files in os.walk(rpmpath):
    for rpmdir in dirs:
        os.system("/usr/bin/tar pczf rpmbuild/rpmdir.tgz rpmdir" )
Du sucht also String-Interpolation?

http://docs.python.org/lib/typesseq-strings.html
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

Sonntag 20. April 2008, 16:39

Datenmetzger, das mit dem tarfile ist natürlich richtig geil ;-) vielen Dank!
@Audax, ich bin mir nicht sicher, ob ich das suche, dal ich, wenn ich mit Interpolation arbeite,

os.system(/usr/bin/tar pczf %(rpmdir).tar.gz %(rpmdir))") % {'rpmdir': rpmdir}

ne Fehlermeldung bekomme, dass ich unsupported operand types hätte, in diesem Fall int und dict. Aber wahrscheinlich liegt der Fehler wohl zwischen meinen Ohren ;-)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 20. April 2008, 16:54

warum so kompliziert?

Code: Alles auswählen

for root, dirs, files in os.walk(rpmpath):
    for rpmdir in dirs:
        print "/usr/bin/tar pczf %s/rpmdir.tgz %s" % (rpmdir, rpmdir)
Hier übrigens:

Code: Alles auswählen

os.system(/usr/bin/tar pczf %(rpmdir).tar.gz %(rpmdir))") % {'rpmdir': rpmdir} 
hast du keinen Formatstring gebaut. Nicht einmal einen String.

Code: Alles auswählen

os.system("/usr/bin/tar pczf %(rpmdir)s.tar.gz %(rpmdir)s" % {'rpmdir': rpmdir} )
Man beachte das "%(foo)s", das 's' muss da stehen und zeigt an, dass dort ein String interpoliert wird.
.D0T
User
Beiträge: 21
Registriert: Donnerstag 17. August 2006, 17:45

Sonntag 20. April 2008, 16:55

Hier aus der doku zu os.walk:
Note: If you pass a relative pathname, don't change the current working directory between resumptions of walk(). walk() never changes the current directory, and assumes that its caller doesn't either.
Du operierst also immer im selben Verzeichniss, wie sollen da mehrere verschiedene Dateien zustande kommen? os.walk durchläuft rekursiv alle Verzeichnisse unter dem gegebenen Level.

Ich weiß auch nicht wirklich was du jetzt genau machen wolltest, in jedem Fall musst du beachten was du als root zurückbekommst, das ohne das vor den directory Namen zu schreiben bist du spätestens im ersten Sub directory voll daneben.

(Du könntest auch einfach gleich nehmen was dir als root gegeben wird :roll: Sind letztenendes auch alle directories, inklusive dem gegebenen Anfangsverzeichniss)
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

Sonntag 20. April 2008, 17:05

Das ist natürlich ein Argument .DOT! Kannst Du eine bessere Methode empfehlen, mir fehlt da leider, das KnowHow
oblivion
User
Beiträge: 13
Registriert: Montag 31. März 2008, 17:21

Sonntag 20. April 2008, 19:22

ok, mittlerweile hab ich zumindest einen weg über os.listdir gefunden, um tar Archive im jeweiligen Verzeichnis anzulegen.

Code: Alles auswählen

import os
import sys
import tarfile
rpmpath = ("c:/rpm")
for elem in os.listdir(rpmpath):
    os.chdir("c://rpm//"+elem)
    ts = tarfile.open(elem+"tar.gz", "w:gz")
    
    ts.close

Allerdings kommt mir einfach nicht in den Sinn, wie ich die jeweiligen Dateien ins richtige tarfile bekomme
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 20. April 2008, 19:37

Schau doch einfach mal in der Dokumentation zu "tarfile" nach, da ist sogar ein Beispiel drin!

Vielleicht noch kurz zu deinem Code:

Die Klammern um "c:/rpm" am Anfang sind vollkommen überflüssig.

Über "os.chdir" in ein Verzeichnis zu wechseln um dort zu arbeiten ist nicht unbedingt schöner Stil. Du bastelst in dem Aufruf doch eh den ganzen Namen zusammen, da kannst du auch direkt "tarfile.open" aufrufen.

Außerdem solltest du dir vielleicht mal die Funktion "os.path.join" anschauen.

Und ein doppelter Slash ist schon sehr seltsam. Du verwechselt da was mit dem Backslash.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Sonntag 20. April 2008, 21:32

ungetestet

Code: Alles auswählen

import os
import sys
import tarfile
RPM_PATH = "c:/rpm"
archive = tarfile.open("myfile.tar.gz", "w:gz")

for elem in os.listdir(rpmpath):
    archive.add(os.path.join(RPM_PATH, elem)   
archive.close 
Wenn ich dein Wunsch korrekt verstanden ahbe
Antworten