Seite 1 von 1
os.system Befehl für iterierbares Objekt
Verfasst: Sonntag 20. April 2008, 13:29
von oblivion
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?
Verfasst: Sonntag 20. April 2008, 13:41
von DatenMetzgerX
Arbeite mit [mod]tarfile[/mod]
dann wäre es sogar platformunabhängig (wie weit das sinn macht ist fragwürdig

)
Re: os.system Befehl für iterierbares Objekt
Verfasst: Sonntag 20. April 2008, 15:11
von audax
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
Verfasst: Sonntag 20. April 2008, 16:39
von oblivion
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

Verfasst: Sonntag 20. April 2008, 16:54
von audax
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.
Verfasst: Sonntag 20. April 2008, 16:55
von .D0T
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

Sind letztenendes auch alle directories, inklusive dem gegebenen Anfangsverzeichniss)
Verfasst: Sonntag 20. April 2008, 17:05
von oblivion
Das ist natürlich ein Argument .DOT! Kannst Du eine bessere Methode empfehlen, mir fehlt da leider, das KnowHow
Verfasst: Sonntag 20. April 2008, 19:22
von oblivion
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
Verfasst: Sonntag 20. April 2008, 19:37
von EyDu
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.
Verfasst: Sonntag 20. April 2008, 21:32
von DatenMetzgerX
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