Serverliste importieren und abarbeiten

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.
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

hab ich das jetzt richtig eingebettet ? So dass er mir in den Funktionen die benötigten variablen abarbeitet ? (Hab in der json datei die ich serverconfig genannt hab 2 teile zu einem zusammengefügt weil ich es eig. nur in der verbindung brauch und es n bissel einfacher gestaltet, somit ist server jetzt usr@ip in der kombo kann ich es nur verwenden)
*edit* oops vergessen parameter zu übergeben : geändert

Code: Alles auswählen

with open("serverconfig.json", "r") as in_file:
    jobs = json.load(in_file)
try:
    for job in jobs[user_eingabe]:
        print "Job: {server}, {path}".format(**job)
        if "zu" in upjs:
            cleanupjs()
            cleanupwsjs(**job)
            exportjs()
            packenjs()
            uploadjs(**job)
            detarjs(**job)
            logging.info("WebApp_JS_Skripts"+standn+server)
        else:
            logging.info("WebApp_JS_Skripts"+stand+server)
     logging.info("Deployment durchgeführt")
except KeyError, e:
    print "Ungültiger / Undefinierter Status"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso probierst Du es nicht einfach aus? ;-)

Ich weiß nicht, was "zu" ist und was "upjs" ist. Also kann ich dazu nichts sagen. Wozu ist dieses if-Konstrukt da?

Prinzipiell sieht es schon mal richtig aus.

Hast Du es denn nicht einmal ohne diese Server-Aufrufe getestet? Ist doch erst einmal das ideale Vorgehen...

Edit: Wenn Du mal wieder einen längeren Code postest, ist es eine gute Idee den in einen paste-Container auszulagern; hier sehr beliebt ist paste.pocoo.org :-)
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

vorerst letzte frage: auf die user_eingabe die du erwähnt hattest habe ich jetzt einen raw_input gelegt der dann die zeichenkette enthält die ich in der json datei als zuordnung festgelegt habe. ist das richtig ?

File "deploymentasl.py", line 111
with open("serverconfig.json", "r") as in_file:

invalid syntax <-- das spuckt er mir beim test erstmal als fehler aus ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

morytox hat geschrieben:vorerst letzte frage: auf die user_eingabe die du erwähnt hattest habe ich jetzt einen raw_input gelegt der dann die zeichenkette enthält die ich in der json datei als zuordnung festgelegt habe. ist das richtig ?
z.B. das, genau. Kommt aber ja drauf an, wenn ich eine GUI habe, dann wird das ganze ja eher aus einem Eingabefeld kommen ;-)
File "deploymentasl.py", line 111
with open("serverconfig.json", "r") as in_file:

invalid syntax <-- das spuckt er mir beim test erstmal als fehler aus ...
Welche Python-Version nutzt Du? Wenn es 2.5 sein sollte, brauchst Du iirc noch ein

Code: Alles auswählen

from future import with
Edit:
Ich würde um das Einlesen der JSON-Datei aber noch eine Exception abfangen:

Code: Alles auswählen

try:
    with open()...
except IOError, e:
    print e
else:
    # hier dann das weitere
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

ich habe 2.4.x version auf meim Linux die aktuelle 3er version für linux müsst ich erstmal kompilieren, darauf hatte ich bisher kein bock...
import hat nix gebracht gleicher fehler
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

morytox hat geschrieben:ich habe 2.4.x version auf meim Linux die aktuelle 3er version für linux müsst ich erstmal kompilieren, darauf hatte ich bisher kein bock...
import hat nix gebracht gleicher fehler
Ok, das erklärt es ;-)

In der 2.4 gibt es kein with-Statement.

Code: Alles auswählen

try:
    in_file = open("name", "r")
    jobs = json.read()
except IOError, e:
    print e
else:
    # deine Funktionalität
finally:
    in_file.close()
Zusätzlich brauchst Du dann ein externes JSON-Modul, z.B.:
http://pypi.python.org/pypi/simplejson/

Doku dazu hier:
http://simplejson.googlecode.com/svn/ta ... index.html

Ich würde aber mal gucken, ob Du nicht auf eine 2.6er updaten kannst. 3.x ist def. noch nicht notwendig, aber für eine 2.4er würde ich nicht mehr wirklich entwickeln wollen.
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

hab das ma so umgewandelt, aber bei meine funktionalität habe ich das noch das was vorher vor den funktionen stand. Hab ich das richtig verstanden dass ich das jetzt wie folgt schreiben muss ?:

Code: Alles auswählen

try:
    in_file = open("serverconfig.json", "r")
    jobs = json.read()
except IOError, e:
    print e
else:
    for job in jobs[user_eingabe]:
        print "Job: {server}, {path}".format(**job)
        if "zu" in upjs:
            cleanupjs()
            cleanupwsjs(**job)
            exportjs()
            packenjs()
            uploadjs(**job)
            detarjs(**job)
            logging.info("WebApp_JS_Skripts"+standn+server)
        else:
            logging.info("WebApp_JS_Skripts"+stand+server)
except KeyError, e:
    print "Ungültiger / Undefinierter Status"
finally:
    in_file.close()
logging.info("Deployment durchgeführt")
logging.shutdown()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

morytox hat geschrieben:hab das ma so umgewandelt, aber bei meine funktionalität habe ich das noch das was vorher vor den funktionen stand. Hab ich das richtig verstanden dass ich das jetzt wie folgt schreiben muss ?:
Nee, so stimmt die Einrückung nicht und Du fängst einen KeyError ab, der nicht von den Zeilen 2+ 3 auisgelöst werden kann. Du willst den in Zeile 7 abfangen!

So sollte es tun:

Code: Alles auswählen

try:
    in_file = open("serverconfig.json", "r")
    jobs = json.read()
except IOError, e:
    print e
else:
    try:
    # ab hier alles noch mal einrücken
    for job in jobs[user_eingabe]:
        print "Job: {server}, {path}".format(**job)
        if "zu" in upjs:
            cleanupjs()
            cleanupwsjs(**job)
            exportjs()
            packenjs()
            uploadjs(**job)
            detarjs(**job)
            logging.info("WebApp_JS_Skripts"+standn+server)
        else:
            logging.info("WebApp_JS_Skripts"+stand+server)
    # ab hier stimmt die EInrückung wieder
    except KeyError, e:
        print "Ungültiger / Undefinierter Status"
finally:
    in_file.close()
# stimmt hier ja gar nicht - imho muss das doch nur bei einem Erfolgsfall
# gemacht werden!
logging.info("Deployment durchgeführt")
# das wäre hier ok
logging.shutdown()
Ich würde Dir dringend mal raten, das Tutorial durchzuarbeiten. Du scheinst bei vielem noch Verständnislücken zu haben.

Desweiteren solltest Du Dir angewöhnen kleine Häppchen zu testen. "Wir" arbeiten schon seit 2 Stunden an dem Problem und Du hast vermutlich nicht einmal gestest, ob Du diese JSON-Datei überhaupt lesen kann!?! Hast Du denn schon ein JSON-Modul installiert?

Wieso testest Du nicht erst einmal den Script-Rumpf ohne die Server-Aufrufe. Dann würdest Du doch schnell sehen, was klappt und an welcher Stelle was stehen muss!
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

hmpf.. joa .. hmm
ma kurz zu meiner lage ... bin Azubi in der 3. Woche und grad dabei Scripten zu lernen mit python , der sprache die ich 4 jahre in der schule hatte aber sone themen wie hier nie angerissen wurden ( zudem isses auch ne ganze zeit her) , zudem muss ich hier mit linux komplett arbeiten was für mich auch n kompletter neueinstieg ist ... nun hatt ich auch noch ne endlose diskussion über das json format , für welches ich jetzt extra module installieren muss und meine sag ich ma vorgesetzten fidnen das nich so toll da das script später auch auf anderen umgebungen laufen muss und man da nicht noch extra module geladen werden sollen... -.-*
kann man auch ne möglichkeit mit csv datein realisieren weil die wohl überall laufen sollen...
also wie die aufgebaut ist wurde mir grad erklärt aber da hier niemand in python programmiert kann mir niemand sagen wie ich das dann umsetze
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich habe JSON ja nur als eine von vielen Möglichkeiten vorgeschlagen! Letztlich würde das in anderen Formaten ähnlich aussehen.

Ich wußte ja nicht, dass Du eine relativ alte Python Version nutzt. JSON ist ab 2.5 iirc in der Standard-Lib von Python dabei.

Natürlich kannst Du auch eine CSV-Datei nutzen:

Code: Alles auswählen

xy, user@192.168.0.1
xy, ich@du.de
yz, "sons was
Hierbei hast Du natürlich das Problem, dass Du darauf achten musst, welche Delimiter Du nimmst, damit es zu keinen Konflikten mit den Daten kommt.

Schau Dir einfach mal das CSV-Modul in der Doku an.

Hast Du denn evtl. mal nachgefragt, ob man nicht einfach Python 2.6 installieren kann? Je nach Linux-Distro sollte es da doch Pakete für geben! Was nutzt ihr denn?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Bitte versuch den Text verstaendlich zu schreiben und zu formattieren.

simplejson gibt es auch als pure Python, das kannst du einfach mit dem Skript verteilen.
Als CSV ist das natuerlich auch moeglich, du musst allerdings erst mal die Datenstruktur wieder herstellen, um einen so konfortablen Algorithmus wie bei Hyperion zu haben.
Die Alternative waere uebrigens 2 Dateien fuer die 2 Gruppen zu benutzen, um das Einlesen zu vereinfachen (Bei JSON braucht man das nicht).
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

installieren des neuen progs ist ungünstig , einfach zu viele server ... und das nur zu übungszwecken ... später soll ich das alles dann in pearl und bash portieren und damit weiterlernen, das ganze ist für mich nur auf python aufgezogen weil ich schon vorwissen mitbringe , nur irgendwann soll ich auf den firmenstandart angepasst werden.

Die einzelnen Elemente trenn ich einfach mit ; da ich dann ja auch datein aus exel importieren kann ... ich probier einfach mal weiter rum jetzt einfach von klein nach groß und wenn ich doch nochmal dringende fragen hab (fr. oder nxt week) schreib ich hier wieder ... müsst ja dann wieder oben sein das topic. Aber trotzdem schonmal ganz vielen dank für die umfangreiche hilfe bisher !
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Cofi: Naja, da es anscheinend nicht so auf Redundanz ankommt, wäre das Format ja einfach so flach wie ursprünglich vorgestellt:

Code: Alles auswählen

xy, user@192.168.0.1
xy, ich@du.de
yz, user@192.168.0.1
yz, sonst was
Ohne Aussagen zur Anzahl an Jobs und wie die Liste eigentlich erstellt wird, kann man sich da schlecht gegen CSV aussprechen. (Außer dass ich den fehlenden Unicode-Support ätzend finde und deswegen meist nicht auf CSV setze)

ok, man muss das Dict erst mal wieder aufbauen, aber in dem Falle geht das ja halbwegs einfach.

@morytox:
Hier wäre mal ein Ansatz mit CSV:

Code: Alles auswählen

import csv
from collections import defaultdict

stati = ["xy", "yz"]

try:
    jobs = defaultdict(list).fromkeys(stati)
    in_file = open("name", "r")
    for row in csv.reader(in_file):
        if row[0] in stati:
            jobs[row[0]]=row[1:]
except IOError, e:
    print e
else:
    # ab hier sollte es gehen wie gehabt.
finally:
    in_file.close()
Edit: Ich sehe grad, dass ich die Path-Angabe oben nicht berücksichtigt habe. Aber das ist ja einfach nur eine Spalte mehr. Allerdings ist die Struktur eines Jobs nun eine Liste und kein dict mehr. Also aufpassen bei der Parameterübergabe ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

morytox hat geschrieben:installieren des neuen progs ist ungünstig , einfach zu viele server ... und das nur zu übungszwecken ... später soll ich das alles dann in pearl und bash portieren und damit weiterlernen, das ganze ist für mich nur auf python aufgezogen weil ich schon vorwissen mitbringe , nur irgendwann soll ich auf den firmenstandard angepasst werden.
Hm... naja, muss ja Dein Ausbilder wissen. Ich würde dann ja Python "vergessen" und mich sofort intensiv mit den obigen Sprachen befassen.

Dass Dein Ausbilder JSON wohl nicht kennt ist natürlich nen Armutszeugnis :-D
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

is das auch gängig in der 2.4 er variante ?
1. finally wollte er in dem zusammenhang nicht nehmen --> nachgelesen und es wurde geschrieben dass es erst ab 2.5 in der konstellation geht. sonst gibt es nur try:, exept, else oder try finally

und 2. wollt ich defaultdict importieren aber er findet es nicht
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

morytox hat geschrieben:is das auch gängig in der 2.4 er variante ?
1. finally wollte er in dem zusammenhang nicht nehmen --> nachgelesen und es wurde geschrieben dass es erst ab 2.5 in der konstellation geht. sonst gibt es nur try:, exept, else oder try finally
Ok, war mir nicht mehr geläufig. Dann musst Du die Fehlerbehandlung eben abändern. Sprich das finally weglassen und das in_file.close() am besten direkt als erstes im else-Zweig ausführen.

@alle: Kann der Fall überhaupt auftreten, an dem das File-Objekt geöffnet wurde, aber ein IOError geworfen wurde?
und 2. wollt ich defaultdict importieren aber er findet es nicht
Mist, auch da hab ich übersehen, dass es das erst ab 2.5 gibt. (Aber Du siehst schon, wie unbequem es ist, mit alten Versionen zu entwickeln ;-) )

Dann musst Du das Dict eben so initialisieren:

Code: Alles auswählen

In [3]: keys = ["foo", "bar"]

In [4]: jobs = {}.fromkeys(keys)

In [5]: jobs
Out[5]: {'bar': None, 'foo': None}

In [10]: for key in jobs.keys():
   ....:     jobs[key] = []
   ....:

In [11]: jobs
Out[11]: {'bar': [], 'foo': []}

In [12]: jobs["bar"].append(13)

In [13]: jobs["foo"].append("geht auch so!")

In [14]: jobs
Out[14]: {'bar': [13], 'foo': ['geht auch so!']}
Das deaultdict erspaart einem eben eine solche Schleife wie in In[10]. Vielleicht geht's auch noch anders / kürzer...
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

den auszug den du mir da grad gegeben hast, was kann ich da rauslesen ? kann mit dem in[x] und out[x] nix anfangen ? Is das ne shellausgabe oder wie ?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

morytox hat geschrieben:den auszug den du mir da grad gegeben hast, was kann ich da rauslesen ? kann mit dem in[x] und out[x] nix anfangen ? Is das ne shellausgabe oder wie ?
Ja, das ist ein Auszug aus einer IPython-Sitzung.
http://ipython.scipy.org/moin/

Du kannst es aber auch in einer normalen Python-Shell nachstellen. IPython bietet eben nur einige Komfort-Funktionen im Gegensatz zur Standard-Shell.

Ich erwähne Zeile 10 ja sogar explizit! Du musst den Transfer von der Initialisierung per defaultdict zu einem normalen schon selber lesiten ;-) Versuche mein Beispiel einmal in einer Shell nachzuvollziehen und dann schau Dir noch mal mein letztes Snippet genau an. Ich will ja eine Datenstruktur aufbauen, die innerhalb eines Dicts zu jedem Schlüssel eine eigene Liste führt. Genau das geht per defaultdict sehr praktisch und muss wegen Python 2.4 nun so "nachgebaut" werden.
morytox
User
Beiträge: 25
Registriert: Dienstag 15. September 2009, 13:17

wie es aussieht hat es sich jetzt ergeben dass sich meine String und variablenverkettung als nicht sinnvoll erwiesen hat da diese nun nichtmehr als zusammen gehörend erkannt wurden ...
jetzt habe ich den befehl os.join folgendermazen angewandt:
vorher
os.system("string"+var+"string")
jetzt
os.system(os.join(["string", var, "string"])) -->
AttributeError: 'module' object has no attribute 'join'

Ich benutze immernoch die Version 2.4 von Py da mir keine andere möglich ist... Lösungsvorschläge ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Da steht doch dein Problem?
Es gibt kein ``os.join`` (Das gilt auch fuer aktuelle Python Versionen)

Entweder meinst du ``os.path.join`` oder die String Methode ``join``.
Antworten