ruttet sys.exit(), funkar inte (python)

Här diskuteras programmering och utveckling
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

ruttet sys.exit(), funkar inte (python)

Inlägg av Victor »

Hejsan! Nu har jag stött på något riktigt skumt. Jag brukar använda mig av funktionen sys.exit() för att avsluta programkörningen. Det funkar i allmänhet men helt plötsligt så fungerar inte funktionen MEN bara på ETT ställe i programmet :S På alla andra ställen i programmet, och i alla andra program, så fungerar det som vanligt.

Det är så att jag kollar om stdin är tom och om den är det så avslutas körningen. Funktionen sys.stdin.isatty() som jag använder mig av verkar fungera bra. Såhär ser funktionen ut:

Kod: Markera allt

def checkstdin():
    '''Check if stdin is empty.'''
    if sys.stdin.isatty():
        print 'The stdin is empty. Either the file does not exist or the file is empty.'
        sys.exit()
simpelt.. När jag kör programmet utan ngt i stdin så stannar programmet upp och bara står och tuggar.. Inget händer men trycker jag Ctrl+D så ser man medelandet och sen avslutas det :S. Det är riktigt konstigt. Jag bifogar hela mitt program, eller rättare sagt bara den filen där problemet uppstår (main-filen).

Kod: Markera allt

import optparse
import os
import sys
import cells
import conf

def checkstdin():
    '''Check if stdin is empty.'''
    if sys.stdin.isatty():
        print 'The stdin is empty. Either the file does not exist or the file is empty.'
        sys.exit()
        
def validExtension(imagename):
    '''Check whether "imagename" has a valid extension'''
    valid = '.jpg'
    if imagename.find(valid) != -1:
        return imagename
    else:
        print 'The extension is not valid.'
        sys.exit()

def viewdata(option, opt, value, parser):
    checkstdin()
    print inputdata
    
def size(option, opt, value, parser):
    size = parser.rargs[0].split(',')
    conf.height = int(size[0])
    conf.width = int(size[1])
    
def main(inputdata):
    parser = optparse.OptionParser()
    
    parser.add_option('-o', '--output', dest='imagename', 
                      help='defines the output-file (the cellmap/image).')
    parser.add_option('-v', '--view', action='callback', callback=viewdata,
                      help='view the stdin.')
    parser.add_option('-s', '--size', action='callback', callback=size, dest='size',
                      help='set the size (height,width).')
    
    (options, args) = parser.parse_args()
    
    if (options.imagename != None):
        checkstdin()
        imagename = validExtension(options.imagename)
        cells.createImg(inputdata, imagename)
    
    else:
        print 'This program requires a option.'

if __name__ == '__main__':
    inputdata = sys.stdin.read()
    main(inputdata)

EDIT: Programmet avslutas heller inte när man "kontaktar" help! alltså: python script.py -h. Jag är tvungen att trycka Ctrl+D då med :S
Senast redigerad av 1 Victor, redigerad totalt 19 gånger.
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

SV: ruttet sys.exit(), funkar inte (python)

Inlägg av Lars »

Standard-in finns ALLTID, och normalt är det knytet till tangentbordet. Ctrl+D sänder EOF vilket avslutar anropet till sys.stdin.read(). Men du måste nog köra isatty() innan du försöker läsa något över huvud taget.
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: ruttet sys.exit(), funkar inte (python)

Inlägg av Victor »

hmm.. okej.. Du säger att jag ska köra isatty() innan jag läser in något. Men vart är det i praktiken? innan main? Stdin läses väl in det första det gör i programmet, men jag har förmodligen fel i det? Det känns som att jag har fått hur isatty fungerar om bakfoten, eller hur stdin öht fungerar :/
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: ruttet sys.exit(), funkar inte (python)

Inlägg av Victor »

Jaja, jag löste det men frågan är om det är "fel" lösning, men det funkar!

innan jag kontaktar main så startas detta:

Kod: Markera allt

if __name__ == '__main__':
    if sys.stdin.isatty():
        inputdata = None
    else:
        inputdata = sys.stdin.read()
    main(inputdata)
Sedan kontaktas checkstdin(inputdata) i koden och den metoden ser ut såhär:

Kod: Markera allt

def checkstdin(inputdata):
    '''Check if stdin is empty.'''
    if inputdata == None:
        print 'The stdin is empty. Either the file does not exist or the file is empty.'
        sys.exit()
/victor
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
jabbadoo
Inlägg: 232
Blev medlem: 11 dec 2006, 21:09
OS: Ubuntu
Utgåva: 10.04 Lucid LTS
Ort: Sweden
Kontakt:

SV: ruttet sys.exit(), funkar inte (python)

Inlägg av jabbadoo »

jag har allmänt haft problem med sys.exit() i funktioner... det står att jag inte kan ha det i en funktion??? kan testa det som victor skrev
Skriv svar

Återgå till "Programmering och webbdesign"