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

Timer in Kommandozeile

Beitragvon suniles » Samstag 16. Juni 2007, 11:53

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:

Beitragvon schlangenbeschwörer » Samstag 16. Juni 2007, 12:16

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:

Beitragvon veers » Samstag 16. Juni 2007, 13:27

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

Beitragvon suniles » Samstag 16. Juni 2007, 16:55

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=]
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()
[/code]

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:

Beitragvon veers » Mittwoch 20. Juni 2007, 17:01

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 20. Juni 2007, 17:12

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

Beitragvon suniles » Freitag 22. Juni 2007, 10:28

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=]
def times():
time.sleep(4)
os.kill(os.getpid(), signal.SIGKILL)

thread.start_new_thread(times, ())
[/code]

danke für Eure bisherigen Vorschläge :D

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder