problem beim lesen/schreiben in datei

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

hallo liste...

ich versuche derzeit aus einer datei eine liste von url's zu überprüfen.
ich habe also eine funktion, an die ich die urls übergeben kann.
nun wollte ich also in etwa sowas machen:

Code: Alles auswählen

f_in = file('lc.in', 'r')
f_out = file('lc.out', 'a+')

for line in f_in: 
    f_out.flush()  
    checkLine = urlChecker(line)
    f_out.write(checkLine+'\n')

f_in.close()
f_out.close()
das ganze klappt auch wunderbar, nur leider gibt es nach etwa 20 urls (ca. 10 sekunden)
einen seg-fault! dabei kann es sich auch immer um die selbe url handeln. daher glaube ich, dass es nichts mit der urlChecker() funktion zu tun hat, sondern irgendetwas mit dem speicher oder sonstwas.
was mache ich falsch? habe auch schon versucht mit try_except irgendwas abzufangen, nur leider schaffe ich das nicht.

bin absolut am ende meines wissens (is ja eh nich so viel bei python...)

danke für jede hilde
ciao
sk
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi


Zeig mal die urlChecker-Funktion. Weil sonst seh ich kein Fehler, ich würde einfach noch das flush weglassen.

Gruss
Gast

nagut is n bissl laenger. allerdings wundert es mich, da wie schon sagte die funktion bei ein und der selben url 20 mal funktioniert und dann nicht mehr!

nicht wundern wo die link und url herkommen, sind halt da. bin mir sicher, dass das nicht die optimale lösung ist, sollte doch aber gehen..oder?

Code: Alles auswählen

def urlChecker(link, url):
    try:
        if link[:4]!='HTTP' and link[:3]!='FTP':
            link = url+link
            link = string.replace(link, '\n', '')
            link = string.replace(link, '../', '')
                
        req = urllib2.Request(link)    
        
        try:
            res = urllib2.urlopen(req)
            if hasattr(res, 'code'):
                returnLink = str(res.code)
            else:
                returnLink = '200'
            return returnLink+' '+link
        except StandardError, e:
            if hasattr(e, 'code'):
                if e.code==401:
                    try:
                        authline = e.headers.get('www-authenticate', '')
                            
                        if not authline:
                            returnLink = 'no authline'
                            return returnLink+' '+link                   
                                
                        authjob = re.compile(r'''(?:\s*www-authenticate\s*:)?\s*(\w*)\s+realm=['"](\w+)['"]''', re.IGNORECASE)
                        matchjob = authjob.match(authline)
                            
                        if not matchjob:
                            returnLink = 'authline badly formed'
                            return returnLink+' '+link
                                
                        scheme = matchjob.group(1)
                        realm = matchjob.group(2)
                            
                        if scheme.lower()!='basic':
                            returnLink = 'only basic authentication supported'
                            return returnLink+' '+link
                            
                        if realm=='xxxx' or realm=='blubb':
                            base64string = base64.encodestring('%s:%s' % ('xxx','yyy'))[:-1]
                            authheader = "Basic %s" % base64string
                            req.add_header("Authorization", authheader)
                            try:
                                res = urllib2.urlopen(req)
                                returnLink = str(res.code)
                            except StandardError, e:
                                returnLink = str(e)
                                    
                        elif realm=='yyy':
                            base64string = base64.encodestring('%s:%s' % ('zzz','yyy'))[:-1]
                            authheader = "Basic %s" % base64string
                            req.add_header("Authorization", authheader)
                            try:
                                res = urllib2.urlopen(req)
                                returnLink = str(res.code)
                            except StandardError, e:
                                returnLink = str(e)
                                    
                    except StandardError, e:
                        returnLink = str(e)
                            
                else:
                    returnLink = str(e.code)
            elif '550' in str(e):
                returnLink = '550'
            else:
                returnLink = str(e)
            return returnLink+' '+link
    except StandardError, e:
        return str(e)
so das wars.
irgend eine idee?

ciao
sk
Gast

...übrigens, wenn ich das flush() weglasse, sehe ich in meiner lc.out datei keine einträge, da das skript ja leider nicht bis zum close() kommt.

...
sk
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Könntest Du bitte die Fehlermeldung zeigen.

BTW: Die Frage kommt mir bekannt vor ... nonsenz? ;)

Gruß, mawe
BlackJack

Deine beiden Quelltexte passen nicht zusammen. Einmal wird nur ein Parameter an `checkUrl()` übergeben, die Funktion nimmt aber 2 entgegen!?
Gast

..yo ich betreibe hier übelstes x-posting :)

nun zur fehlermeldung. bin nicht mehr am system, aber das einzige, was da ausgespuckt wurde war glaube ich:

Code: Alles auswählen

segmentation fault
die beiden passen nicht zusammen, weil ich beim ersten beitrag etwas verkürzen wollte. bei mir steht das ein wenig anders - es passt also zusammen.

gute nacht und danke
ciao

sk bzw. nons ;)
BlackJack

`segmentation fault` ist ein schlechtes Zeichen. Das bedeutet, das das Programm wirklich "hart" aussteigt, also kein kontrolliertes Beenden mit einer Exception oder so. Also kann man mit Python-Mitteln auch nicht so genau herausfinden wo es kracht.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich sehe oben im Listing auch eine mega große try-except Geschichte... Ich würde vielleicht das mal weglassen. Zumal du in dem try-Part schon einige kleinere try-except's hast...
Wenn das auch nicht hilft, würde ich einfach Teile des Programms auskommentieren und sehen, wann es klappt und wann nicht...
sog. Händische-try-except :P

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

ja also die riesige try-klammer hab ich am ende noch rumgesetzt, weil ich hoffte irgendwas noch abzufangen. war also eigentlich mal nicht da -> keine veränderung.
ich habe nun mit print ausdrücken versucht den fehler einzugrenzen und dabei passieren hier sehr merkwürdige dinge:
an einer bestimmten stelle im code führt eine print statement entweder zum seg-fault oder zum killed, d.h. wenn ichs auskommentiere läuft das programm bis es wie immer nach (in diesem fall) 26 url abbricht, wenn ich allerdings das print drin lasse, bricht das programm beim erstan mal an dieser stelle ab. das ganze passiert auch wenn ichs mit dem nächsten print versuche. komischer weise steht weiter hinten in der funktion ein print ('realm 1 OK !'), welches problemlos funktioniert.
hier nochmal der mit prints versehene code mit der gekennzeichneten stelle:

Code: Alles auswählen

def linkChecker(link, url):
    try:
        if link[:4]!='HTTP' and link[:3]!='FTP':
            link = url+link
            link = string.replace(link, '\n', '')
            link = string.replace(link, '../', '')
                
        req = urllib2.Request(link)    
        
        try:
            print 'versuche Verbindung herzustellen...'
            res = urllib2.urlopen(req)
            if hasattr(res, 'code'):
                returnLink = str(res.code)
            else:
                returnLink = '200'
            print 'kein except'
            return returnLink+' '+link
        except StandardError, e:
            print '1. except'
            if hasattr(e, 'code'):
                print 'Error hat Attribute e'
                if e.code==401:
                    try:
                        print 'e = 401, versuche authline zu kriegen'
                        authline = e.headers.get('www-authenticate', '')
                            
                        if not authline:
                            returnLink = 'no authline'
                            print 'no authline'
                            return returnLink+' '+link                   
       #---------->   AB HIER GIBT ES MIT PRINT PROBLEME!!!
                        #print 'versuche authjob zu kriegen'        
                        authjob = re.compile(r'''(?:\s*www-authenticate\s*:)?\s*(\w*)\s+realm=['"](\w+)['"]''', re.IGNORECASE)
                        #print 'versuche matchjob zu kriegen'
                        matchjob = authjob.match(authline)
                            
                        if not matchjob:
                            returnLink = 'authline badly formed'
                            print 'authline badly formed'
                            return returnLink+' '+link
                        
                        #print 'versuche scheme zu kriegen'        
                        scheme = matchjob.group(1)
                        #print 'versuche realm zu kriegen'
                        realm = matchjob.group(2)
                            
                        if scheme.lower()!='basic':
                            returnLink = 'only basic authentication supported'
                            #print 'only basic authentication supported'
                            return returnLink+' '+link
                            
                        if realm=='xxx' or realm=='yyy':
                            base64string = base64.encodestring('%s:%s' % ('xxx','xyx'))[:-1]
                            authheader = "Basic %s" % base64string
                            req.add_header("Authorization", authheader)
                            try:
                                #print 'versuche autentifizierte Verbindung (1. Realm)herzustellen...'
                                res = urllib2.urlopen(req)
                                print 'hat geklappt...'
                                returnLink = str(res.code)
                                print 'realm 1 OK !'
                                return returnLink+' '+link
                            except StandardError, e:
                                returnLink = str(e)
                                print 'realm 1 NOT OK !'
                                return returnLink+' '+link    
                        elif realm=='zzz':
                            base64string = base64.encodestring('%s:%s' % ('yyy','xxx'))[:-1]
                            authheader = "Basic %s" % base64string
                            req.add_header("Authorization", authheader)
                            try:
                                print 'versuche autentifizierte Verbindung (2. Realm)herzustellen...'
                                res = urllib2.urlopen(req)
                                returnLink = str(res.code)
                                print 'realm 2 OK !'
                                return returnLink+' '+link
                            except StandardError, e:
                                returnLink = str(e)
                                print 'realm 2 NOT OK !'
                                return returnLink+' '+link
                    except StandardError, e:
                        returnLink = str(e)
                        print 'problem ! !'
                        return returnLink+' '+link    
                else:
                    returnLink = str(e.code)
                    print 'e.code != 401'
                    return returnLink+' '+link 
            elif '550' in str(e):
                returnLink = '550'
                print 'e.code nicht vorhanden, sollte 550 sein'
                return returnLink+' '+link 
            else:
                returnLink = str(e)
                print 'e.code nicht vorhanden'
                return returnLink+' '+link 
    except StandardError, e:
        print 'keine ahnung'
        return str(e)
        

so ich bin ratlos. is der speicher im eimer? oder was ist hier los?
danke und ciao

sk

Edit (Leonidas): Code in Python-Tags gesetzt.
Gast

so erstmal warum ist das da oben so braun? naja egal...
und nund zum spannenden teil:

der fehler tritt hier nur bei python 2.4 auf nicht bei 2.3 !!!!

bei python 2.3 rödelt er hunderte von urls durch ohne seg-fault!!!
ich bin froh aber auch verwirrt. ich bin hier nicht der sever-admin, habt ihr ne idee woran das liegen kann?

ciao
sk
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:so erstmal warum ist das da oben so braun?
Weil du es ins Code-Tag gesetzt hast, statt das Python-Tag zu benutzen. Ich habe das mal editiert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten