Konsolenausgabe vollständig in Datei schreiben

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
SNC
User
Beiträge: 6
Registriert: Donnerstag 3. Mai 2007, 08:13

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
SNC
User
Beiträge: 6
Registriert: Donnerstag 3. Mai 2007, 08:13

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?
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.
SNC
User
Beiträge: 6
Registriert: Donnerstag 3. Mai 2007, 08:13

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 :?:
SNC
User
Beiträge: 6
Registriert: Donnerstag 3. Mai 2007, 08:13

Hat sich soeben erledigt, es klappt endlich :D
Antworten