python frage: problem beim lesen/schreiben in datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
nonsenz
Beiträge: 232
Registriert: 26.10.2002 20:16:49
Wohnort: berlin

python frage: problem beim lesen/schreiben in datei

Beitrag von nonsenz » 30.05.2005 20:23:00

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 hilfe
ciao

nons

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 30.05.2005 20:31:19

Das .flush() ist überflüssig und wahrscheinlich performancehindernd...
Abgesehen davon ist dein Code in Ordnung, und einen Segfault sollte man mit Python nicht erzeugen können, das deutet auf einen anderen Fehler hin.
Kannst du mal das ganze Programm no-pasten?

Benutzeravatar
nonsenz
Beiträge: 232
Registriert: 26.10.2002 20:16:49
Wohnort: berlin

Beitrag von nonsenz » 30.05.2005 20:36:13

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
nons

Benutzeravatar
nonsenz
Beiträge: 232
Registriert: 26.10.2002 20:16:49
Wohnort: berlin

Beitrag von nonsenz » 30.05.2005 20:51:54

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

...
nons

Antworten