Seite 1 von 1

Konsolenausgabe vollständig in Datei schreiben

Verfasst: Montag 7. Mai 2007, 14:28
von SNC
Hallo,

Ich arbeite im Moment an einem Skript in dem mir diverse Daten in der Konsole und als .xml File ausgegeben werden. Im Code enthalten sind z.B. Abfragen wie diese:

Code: Alles auswählen

#Aufbau der Verbindung
client = pywbem.WBEMConnection(sys.argv[1], (sys.argv[2], sys.argv[3]))

#Abfrage der registered virtual machines
vms = client.EnumerateInstances('VMWARE_VMComputerSystem', NS)

#Wenn Abfrage == 0 ist.....
if vms is None:
   print 'No virtual machines detected on %s' % sys.argv[1]
   sys.exit(0)

#Ausgabe der registered virtual machines 
for vm in vms:
   print '  Server %s' % sys.argv[1]
   elementNameProp = vm['ElementName']
   print '  ElementName \"%s\"' % elementNameProp
   nameProp = vm['Name']
   print '  Name \"%s\"' % nameProp
   iDenDis = vm['IdentifyingDescriptions']
   print '  Identifikation \"%s\"' % iDenDis
   oDenDis = vm['OtherIdentifyingInfo']
   print '  Beschreibung   \"%s\"' % oDenDis
Die Ausgabe hierbei sind alle „virtual maschines“ vom angefragten ESX-Server. In der Konsole wird alles korrekt angezeigt.Nur wenn ich das ganze z.B. in eine .txt Datei schreibe (f = file("das.txt", "w") etc…) wird
nur eine (die letzte) „virtuelle Maschine“ in die Datei geschrieben. Meine Frage also, wie bekomme ich es hin das alle Informationen aus der Konsole in die Datei geschrieben werden?

Edit (Leonidas): Code-Highlighting eingeschaltet.

Re: Konsolenausgabe vollständig in Datei schreiben

Verfasst: Montag 7. Mai 2007, 14:41
von Leonidas
SNC hat geschrieben:Die Ausgabe hierbei sind alle „virtual maschines“ vom angefragten ESX-Server. In der Konsole wird alles korrekt angezeigt.Nur wenn ich das ganze z.B. in eine .txt Datei schreibe (f = file("das.txt", "w") etc…) wird
nur eine (die letzte) „virtuelle Maschine“ in die Datei geschrieben. Meine Frage also, wie bekomme ich es hin das alle Informationen aus der Konsole in die Datei geschrieben werden?
Kann es sein, dass du das ``file`` erst in der ``for``-Schleife öffnest? Damit wird in jeder Iteration das ``file`` geöffnet, der Inhalt geschrieben, das ``file`` geschlossenn. Bei der nächsten Iteration wird es dann wieder überschrieben...

Daher: du musst das ``file`` vor der Schleife öffnen und nach der Schleife schließen.

Verfasst: Montag 7. Mai 2007, 14:43
von gerold
Hallo SCN!

Leider zeigst du nicht auf, wie du etwas in die Textdatei zu schreiben versuchst. Aber egal; ich habe hier etwas, das dir evt. weiterhilft: http://www.python-forum.de/topic-6157.html

Dann habe ich noch einen Tipp für dich: Arbeite nicht ständig mit sys.argv[1-2], sondern binde die Werte an Variablen mit aussagekräftigem Namen. Z.B. so:

Code: Alles auswählen

username = sys.argv[1]
password = sys.argv[2]
database = sys.argv[3]
Damit dokumentiert sich dein Code schon fast wie von selbst.

mfg
Gerold
:-)

Verfasst: Montag 7. Mai 2007, 15:13
von SNC
Hiho,

erstmal danke für die schnellen Antworten.

@gerold
An den Thread hab ich mich zuerst gehalten wie ja schon oben geschrieben leider ohne Erfolg. Aber trotzdem danke für den Hinweis.
Leider zeigst du nicht auf, wie du etwas in die Textdatei zu schreiben versuchst
das liegt daran das mein Skript im Moment nahezu minütlich umgebaut wird. :) aktueller Stand ist:

Code: Alles auswählen

#Daten in xml wandeln
result = pyfo(s_list, pretty=True, prolog=True, encoding='ascii')
print result.encode('ascii', 'xmlcharrefreplace')

#Daten in Datei schreiben
f = file("das.xml", "w") 
f.writelines(result.encode('ascii', 'xmlcharrefreplace')) 
f.close()

#Öffnen der .xml Datei mit Browser
webbrowser.open("C:\Dokumente und Einstellungen\pengelen\Desktop\pyfo-0.5\pyfo-0.5\das.xml")
Diese Ausgabe hat natürlich nicht mit meiner Frage zu tun da get es mir mehr um die .xml Ausgabe.
Dann habe ich noch einen Tipp für dich: Arbeite nicht ständig mit sys.argv[1-2], sondern binde die Werte an Variablen mit aussagekräftigem Namen.
Da halt ich mich bisher stur an die VMWARE Beispiele aber ich weiss natürlich das ich das ganze auch in Variablen speichern kann.

@Leonidas

Wenn ich dich richtig verstehe soll ich das File vor der Abfrage öffnen --> dann die Abfrage tätigen --> Abfrage in File schreiben --> Dann bei nächster Abfrage das ganze von vorne?

Verfasst: Montag 7. Mai 2007, 16:18
von BlackJack
Du sollst die Datei nur einmal öffnen, alles reinschreiben und dann schliessen.

Jedesmal wenn Du eine Datei zum schreiben öffnest, wird der alte Inhalt gelöscht. Es sei denn Du öffnest sie im Anfügemodus, dann musst Du aber den Fall, dass Du sie wirklich neu erstellen möchtest, besonders behandeln.

Verfasst: Montag 21. Mai 2007, 10:35
von SNC
Hiho,
ich muss diesen Thread leider nochmal hervorkramen :)
Das Skript ist mittlerweile fertig jetzt fehlt mir nur noch die formatierte
Ausgabe in einem Textfile. Jetzt wurde mir 2 x geraten:
Daher: du musst das ``file`` vor der Schleife öffnen und nach der Schleife schließen.
Du sollst die Datei nur einmal öffnen, alles reinschreiben und dann schliessen.
Ich habe nun rumprobiert und komme immer noch auf das gleiche Ergebnis. Bei der Ausgabe wird quasi nur ein Schleifendurchlauf mitgeloggt. Wenn ich richtig verstanden habe soll ich das File hier öffnen:

Code: Alles auswählen

#Hier vor der Schleife starten
#f = file ("test.txt", "w")
#f.write("VMName:\t\t")
#f.write(elementNameProp) 
for vm in vms:
   print '  Server %s' % sys.argv[1]
   elementNameProp = vm['ElementName']
   print '  ElementName \"%s\"' % elementNameProp
   nameProp = vm['Name']
   print '  Name \"%s\"' % nameProp
   iDenDis = vm['IdentifyingDescriptions']
   print '  Identifikation \"%s\"' % iDenDis
   oDenDis = vm['OtherIdentifyingInfo']
   print '  Beschreibung   \"%s\"' % oDenDis
#Nach dieser Schleife f.close()
oder alternativ mit f = open("test.txt")........usw.

Ich frage mich nun liegts an der Postion wo ich mit f = .... arbeite oder
ist für diesen Logvorgang das arbeiten mit file ehr ungünstig?
Oder Möglichkeit c) ich habs komplett missverstanden und bin auf einem völlig falschem Weg :?:

Verfasst: Montag 21. Mai 2007, 12:51
von SNC
Hat sich soeben erledigt, es klappt endlich :D