Seite 1 von 1

PNG-File abspeichern, nur wie?

Verfasst: Montag 30. August 2004, 17:06
von Gast
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

Verfasst: Montag 30. August 2004, 18:01
von Milan
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()

Verfasst: Montag 30. August 2004, 18:11
von Dookie
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

Verfasst: Montag 30. August 2004, 18:32
von Milan
Hi. Wieso schließ ich damit sys.stdout ? Ich schließ doch nur die offnene Datei, nicht aber die Ausgabe (sys.stdout).

Verfasst: Montag 30. August 2004, 18:42
von Dookie
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

Verfasst: Montag 30. August 2004, 18:53
von Gast
Naja klingt schonmal gut, werd ich morgen versuchen. Wenn jmd noch andere Vorschläge hat, immer her damit *fg*

Tüt, tüt Alarm :) Nix geht

Verfasst: Dienstag 31. August 2004, 11:48
von Gast

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?