avanti und Python oder Wer hat Angst vor Schlangen?

Michael Lackhoff lackhof at uni-muenster.de
Fr Nov 28 10:12:14 CET 1997


Herr Hoeppner schrieb:

> wer mal sehen will, wie man avanti mit der Scriptsprache Python 
> ansteuern kann, findet bei uns auf dem ftp Server im Verzeichnis 
> \ac15\windows die Datei PYCLIENT.LZH. 

herzlichen Dank dafuer. Das Demo klappt bisher auch wunderbar (mit 
kleinen Jobs). Ein Problem habe ich allerdings bei der Verarbeitung 
der Antwort. Der entscheidende Abschnitt sieht so aus:
        while 1:
            # Schleife
            data = s.recv(4096)         # Daten empfangen
#1 *******************^^^^^^
            # Falls AVANTI:EOR, dann ist Schlua
            if string.find( data, "AVANTI:EOR" ) > -1:
                # Ende Kennung wegnehmen
                data = regsub.sub( "AVANTI:EOR", "", data );
#2 ************************************************^^^^^^
                self.Antwort = self.Antwort + data
                break       # Abbruch dieser Schleife

            # die empfangenen Daten an das bisher empfangene anh"ngen
            self.Antwort = self.Antwort + data

Was passiert nun, wenn die komplette Antwort einschliesslich 
AVANTI:EOR z.B. 5000 Zeichen hat? Dann kommt "AVANTI" im ersten 
Durchlauf der Schleife und ":EOR" im zweiten. string.find muesste 
sich dumm und dusselig suchen und der Client haengt sich in 
einer Endlosschleife auf. Oder habe ich etwas uebersehen?
Natuerlich koennte man den Test jeweils auf Antwort loslassen aber 
das wird bei groesseren Jobs doch eine Menge overhead.

Ich hatte es selbst vorher auch schon einmal versucht und bin auf 
diese ebenfalls sehr unbefriedigende Loesung gekommen:
data = s.recv(100000)   # ob das gutgeht?
lines = string.splitfields(data, '\n')
for line in lines:
  if line == 'AVANTI:EOR':
     s.close()
  else: print line

Klar, ich habe mich da von Perl leiten lassen mit seiner 
Moeglichkeit, sockets zeilenweise zu lesen. Es ist mir allerdings 
nicht gelungen, mit einem kleineren buffer zeilenweise an data 
anzuhaengen und jede gefuellte Zeile auf AVANTI:EOR zu pruefen.

Hat vielleicht jemand noch eine Idee dazu?
Oder gibt es vielleicht sogar demnaechst eine ganz andere 
Moeglichkeit, auf avanti von Scriptsprachen aus zuzugreifen 
(Stichwort SWIG)? ;-)

Ach ja, seit gestern gibt es die erste beta von python 1.5. Die hat 
"richtige" Regular expressions (also so wie von Perl gewohnt). Damit 
wird Python wohl wirklich zu einer Alternative. Etwas von Perls 
"magic" muss es aber wohl doch noch lernen.

Gruss
Michael Lackhoff

########################################################################
# Michael Lackhoff                     e-mail  lackhof at uni-muenster.de #
# Hoersterplatz 4                      Tel.    0251-4833257            #
# 48147 Muenster                       FAX     0251-4833275            #
# Hochschule der Franziskaner und Kapuziner in Muenster                #
########################################################################




Mehr Informationen über die Mailingliste Allegro