Sida 1 av 1

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

Postat: 19 jul 2007, 10:02
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

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

Postat: 19 jul 2007, 12:23
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.

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

Postat: 19 jul 2007, 12:33
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 :/

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

Postat: 19 jul 2007, 14:22
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

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

Postat: 24 aug 2007, 20:23
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