PNG-File abspeichern, nur wie?

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
Gast

Montag 30. August 2004, 17:06

Hallo,

Ich muss von der Arbeit aus was automatisieren. Es geht darum, dass wir Messergebnisse via Browser vom Intranet angucken. Nun sollen jedoch diese Messergebnisse (PNG-Bilder) nicht nur angeguckt werden können, sondern auch archiviert werden. Sprich, ich will irgendwie dieses Bildchen mit nem fixen Namen auf der Platte des Server haben, weiss aber nicht wie ich das ohne grossen Aufwand machen soll. Umpipen ist leider fehlgeschlagen, und auch diverse andere Sachen habe ich probiert. Da ich nicht so der Python-Kenner bin, gibts dafür sicher (bzw hoffentlich) ne einfach Lösung


Dies ist das Script, das auch direkt im Browser verlinked ist... Sprich die CGI gibt direkt ein Bild zurück (wohl PNG-Format)

Code: Alles auswählen

#! /bin/bash
. /etc/profile.local
python $CONTROL_CGIDIR/printcal.py $1 $2 $3 $4 $5 $6

Und dies hier nun das eigentlich Script, das wohl auch die Grafik erzeugt.

Code: Alles auswählen

#!/usr/bin/python
import sys

# ***** Change 02.05.2002 START
import posix
xml_inbox=posix.environ['CONTROL_INBOX']
# ***** Change 02.05.2002 END

def usage():
	print 'usage: printcal.cgi <cdp_id=8834> <detector=DET1> <date=now> <window=30>'

def Main():
	import traceback, sys, string
	import obseval
	cdp_id=sys.argv[1]
	detector=sys.argv[2]
	str=string.replace(sys.argv[3],'\\','')
	str=string.replace(str,' ','')
	date=eval(str)
	window=string.atoi(sys.argv[4])
# ***** Change 02.05.2002 START
#	cal=obseval.GetCalibration(cdp_id,detector,date,window)
	FileName=sys.argv[5]
	x=obseval.ParseFile(FileName)
	cal=x.GetCalibrationFromXML(detector)
# ***** Change 02.05.2002 END
	cal.Plot2D()

if __name__=='__main__':
	Main()
Soich hoffe diese beiden Scripte reichen, oder braucht ihr noch andere Bibliotheken um da durchzublicken?

Wie gesagt mir gehts darum, dass jedesmal, wenn so ein "Messergebnis" angeguckt wird (sprich das CGI aufgerufen wird), nicht nur das Bild zurückgeliefert wird, sondern auch irgendwo auf der HD abgelegt wird.

Ich hoff mir kann jemadn helfen bitte
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Montag 30. August 2004, 18:01

Hi. Warum soll umpipen fehlschlagen? Du musst nur die Ausgabe verändern. Aber ich bekomme Bauchschmerzen, wenn ich den Code sehe: das Modul string ist veraltet, string.stoi ist längst überfällig, da es Builtin-Funktionen wie z.B. int und str gibt. Deswegen tut es mir auch weh, zu sehen, wie str überschrieben wird...

Code: Alles auswählen

import sys
class piper:
    def __init__(self, dateiobj, ausgabe=sys.stdout):
        self.dateiobj=dateiobj
        self.ausgabe=ausgabe
    def write(self,x):
        self.dateiobj.write(x)
        self.dateiobj.flush()
        self.ausgabe.write(x)
    def writelines(self,lines):
        for line in lines:
            self.write(line)
    def __del__(self):
        del self.dateiobj

#Programmcode von dir

if __name__ == "__main__":
    sys.stdout=piper(file("bild_auf_hdd.png","wb"),sys.stdout)
    Main()
Zuletzt geändert von Milan am Montag 30. August 2004, 19:02, insgesamt 1-mal geändert.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 30. August 2004, 18:11

Hi Milan,

bei Deinem Code, bekomm ich aber auch Bauchschmerzen ;)

Code: Alles auswählen

...
    def __del__(self):
        self.dateiobj.close()
damit schließt Du unter Umständen sys.stdout besser wär hier wenn schon explizit geschlossen wird:

Code: Alles auswählen

    def __del__(self):
        del self.dateiobj
So überlässt Du es dem dateiobj, sich zu schließen, wenn keine Referenz mehr darauf existiert.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Montag 30. August 2004, 18:32

Hi. Wieso schließ ich damit sys.stdout ? Ich schließ doch nur die offnene Datei, nicht aber die Ausgabe (sys.stdout).
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 30. August 2004, 18:42

Du schließt eine Datei, die du nicht selber geöffnet hast. Das kann alles mögliche sein, auch sys.stdout!

Code: Alles auswählen

my_log = file("my.log", "w")
p = piper(sys.stdout, my_log)
p.write("Hallo\n")
del p
my_log.close()
print "uups"

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Montag 30. August 2004, 18:53

Naja klingt schonmal gut, werd ich morgen versuchen. Wenn jmd noch andere Vorschläge hat, immer her damit *fg*
Gast

Dienstag 31. August 2004, 11:48

Code: Alles auswählen

#!/usr/bin/python
import sys
 
class piper:
     def __init__(self, dateiobj, ausgabe=sys.stdout): 
        self.dateiobj=dateiobj 
        self.ausgabe=ausgabe 
     def write(self,x): 
        self.dateiobj.write(x) 
        self.dateiobj.flush() 
        self.ausgabe.write(x) 
     def writelines(self,lines): 
        for line in lines: 
           self.write(line) 
     def __del__(self): 
         del self.dateiobj 

# ***** Change 02.05.2002 START 
import posix 
xml_inbox=posix.environ['CONTROL_INBOX'] 
# ***** Change 02.05.2002 END 
	
def usage(): 
    print 'usage: printcal.cgi <cdp_id=8834> <detector=DET1> <date=now> <window=30>' 

def Main(): 
    import traceback, sys, string 
    import obseval 
    cdp_id=sys.argv[1] 
    detector=sys.argv[2] 
    str=string.replace(sys.argv[3],'\\','') 
    str=string.replace(str,' ','') 
    date=eval(str) 
    window=string.atoi(sys.argv[4]) 
    FileName=sys.argv[5] 
    x=obseval.ParseFile(FileName) 
    cal=x.GetCalibrationFromXML(detector) 
    cal.Plot2D() 

#Programmcode von dir 
if __name__ == "__main__": 
    sys.stdout=piper(file('/tmp/bild_auf_hdd.png','wb'),sys.stdout) 
    Main()
Ich hab jetzt den Code so umgeschrieben. Aber irgendwie macht er mir gaarnix, erzeugt weder n Bild noch speichert er nun eines ab. Sicher hab ich irgendwo nen Fehler oder mehrere drin, nur wo?

Und gibts mit Python auch irgendwie nen Debug-Mode oder ähnliches? Damit ich Syntaxfehler, etc gleich am Anfang feststellen kann?
Antworten