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.
Gast

PNG-File abspeichern, nur wie?

Beitragvon 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

Beitragvon Milan » 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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » 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: Alles auswählen

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

Beitragvon Milan » 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).
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » 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: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon 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

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

Beitragvon 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?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder