Timer in Kommandozeile

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
suniles
User
Beiträge: 8
Registriert: Freitag 23. Juni 2006, 11:13

Hallo,

ich möchte gerne eine Eingabe(Tastataur) in der Kommandozeile machen und die nach einer vorgebenen Zeitspanne das Programm bzw. die Eingabe beendet.
Zur Zeit bin ich mir nicht sicher, ob ich es mit per Thread oder Timing oder auch ein einfacher spleep Aufruf helfen kann. :-(

Könnt Ihr mir bitte einen Gedankenstoss geben?

Danke:-)
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi,
Was genau willst du denn machen? Wenn du das Programm für eine Zeit nur einfrieren willst, kannst du sleep() nehmen. Vlt. ginge das auch mit ner Schleife, wo man die Zeit prüft und dann ggf. abbricht. Mit Threads wirds schwieriger, gige aber wohl. Kommt ganz auf das Ziel an.
Etwas Code schadet nie.
Gruß, jj
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich hab solche Sachen meistens per signal/alarm() gelöst.

Code: Alles auswählen

import signal
def alarm(sig, frame):
    raise Exception("Timeout")
    signal.signal(signal.SIGALRM, alarm)
signal.alarm(10)
try:
    foo = raw_input("Foo: ")
    signal.alarm(0)
catch Exception, e:
    print "Timeout"
Wird aber vermutlich unter Windows nicht gehen und ist auch eher der C Weg.
hoffentlich wird jemand noch etwas Pythonischeres posten :)[/code]
suniles
User
Beiträge: 8
Registriert: Freitag 23. Juni 2006, 11:13

schlangenbeschwörer hat geschrieben:Hi,
Was genau willst du denn machen? Wenn du das Programm für eine Zeit nur einfrieren willst, kannst du sleep() nehmen. Vlt. ginge das auch mit ner Schleife, wo man die Zeit prüft und dann ggf. abbricht. Mit Threads wirds schwieriger, gige aber wohl. Kommt ganz auf das Ziel an.
Etwas Code schadet nie.
Gruß, jj

Code: Alles auswählen

def main():
	while True:
		print thema #Haupthema ausgeben
        for i in abc: 
            sys.stdout.write(i + "\n")
            #sys.stdout.write("\n") 
            sys.stdout.flush() 
        tastatur = raw_input(">> ") 
        if tastatur == 'yy': 
            break 
            print "Eingabe abgebrochen....." 
        else: 
            eingabe.append(tastatur) 
            eingabe.sort() 
hier ist ein Teilbereich die Eingabe abfragt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich habe es nun nochmal anders versucht:

Code: Alles auswählen

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
import fcntl, os, sys, time
class Timeout(Exception): pass
def read_timeout(timeout):
    t = time.time()
    fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)
    buff = ""
    while time.time() < t + timeout and not buff.endswith("\n"):
        try:
            buff += os.read(sys.stdin.fileno(), 1)
        except OSError:
            pass
        time.sleep(0.01)
    fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, os.O_SYNC)
    return buff
    
def main():
    password = "swordfish"
    print "Sie haben 10 Sekunden Zeit um das Passwort einzugeben, sollten"
    print "sie es nicht schaffen wird sich dieses Programm vernichten"
    if read_timeout(10).strip() != password:
        print "b0000m"
    else:
        print "Geheim!"
    print raw_input("Nichts kaputt? ")

if __name__ == "__main__":
    main()
Geht das auch unter Windows?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

veers hat geschrieben:Geht das auch unter Windows?
Hallo veers!

Nicht wirklich: ``ImportError: No module named fcntl``

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
suniles
User
Beiträge: 8
Registriert: Freitag 23. Juni 2006, 11:13

gerold hat geschrieben:
veers hat geschrieben:Geht das auch unter Windows?
Hallo veers!

Nicht wirklich: ``ImportError: No module named fcntl``

mfg
Gerold
:-)
...ich habe noch etwas rumprobiert und es mit dieser Lösung halbwegs geschafft. Die Ausgabe auf dem Bildschim muss ich noch unterdrücken. Aber es erfülltzumindest seinen Zweck und man kann es weiter ausbauen.

Code: Alles auswählen

def times():
    time.sleep(4)
    os.kill(os.getpid(), signal.SIGKILL)

thread.start_new_thread(times, ())
danke für Eure bisherigen Vorschläge :D
Antworten