Discussion:
[Python] Kan man få et program til at vente på input i et begrænset tidsrum?
(for gammel til at besvare)
Bertel Lund Hansen
2010-12-30 13:49:28 UTC
Permalink
Hej alle

Jeg bruger raw_input() når brugeren skal angive et eller andet.
Det er nemt nok.

Men hvad nu hvis jeg kun vil have et program til at vente f.eks.
et minut og så gå videre hvis der ikke er nogen reaktion?
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
Klaus Alexander Seistrup
2010-12-30 16:37:05 UTC
Permalink
Post by Bertel Lund Hansen
Jeg bruger raw_input() når brugeren skal angive et eller andet.
Det er nemt nok.
Men hvad nu hvis jeg kun vil have et program til at vente f.eks.
et minut og så gå videre hvis der ikke er nogen reaktion?
Traditionelt ville man vel benytte select():

#v+

from sys import stdin, stdout
from select import select

(i, o, e) = select([stdin], [], [], 60)

if type(i) == type(stdin):
resp = i.read()
else:
resp = None

if resp is not None:
print resp

#v-

Bemærk at select() kun fungerer på sockets under Windows, ikke på filer,
men så kan man i stedet sætte et timerinterrupt op:

#v+

import signal
from sys import stdout

def timeout(signum, frame):
print 'timeout'

signal.signal(signal.SIGALRM, timeout)

def my_input(msg):
try:
stdout.write(msg)
stdout.flush()
return raw_input()
except:
return

signal.alarm(60)
resp = my_input('Du har 1 minut til at taste et svar: ')
signal.alarm(0)
if resp is not None:
print resp

#v-

Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
Klaus Alexander Seistrup
2010-12-30 21:44:18 UTC
Permalink
Post by Klaus Alexander Seistrup
(i, o, e) = select([stdin], [], [], 60)
resp = i.read()
Man får osse en liste tilbage, så udskift ovenstående med

#v+

(i, o, e) = select([stdin], [], [], 60)

fi = i[0]

if type(fi) == type(stdin):
resp = fi.read()

#v-

Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
Bertel Lund Hansen
2010-12-30 23:08:58 UTC
Permalink
Post by Klaus Alexander Seistrup
Man får osse en liste tilbage, så udskift ovenstående med
Jeg har prøvet mulighederne. Jeg ved ikke hvordan jeg kombinerer
koden med noget socket-noget, og af en eller anden grund vil min
Python (2.6.6) ikke acceptere det med signal selv om
dokumentationen omtaler det.

Jeg synes det er lidt træls at man ikke blot kan aflæse to
keyboard-variable som f.eks. i C med conio.h, getch() og kbhit().
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
Klaus Alexander Seistrup
2010-12-30 23:25:04 UTC
Permalink
[…] af en eller anden grund vil min Python (2.6.6) ikke acceptere
det med signal selv om dokumentationen omtaler det.
Python 2.6.5 her (og det virker med signal). Jeg tænker at det snarere
har noget med operativsystemet at gøre end med Python…
Jeg synes det er lidt træls at man ikke blot kan aflæse to
keyboard-variable som f.eks. i C med conio.h, getch() og kbhit().
Våde DOS-drømme?

Der er en der angiveligt har en løsning der virker under Windows:

· http://stackoverflow.com/questions/1335507/keyboard-input-with-timeout-in-python/3911477#3911477
· http://goo.gl/pzKK0

Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
Bertel Lund Hansen
2010-12-30 23:34:13 UTC
Permalink
Post by Klaus Alexander Seistrup
Post by Bertel Lund Hansen
Jeg synes det er lidt træls at man ikke blot kan aflæse to
keyboard-variable som f.eks. i C med conio.h, getch() og kbhit().
Våde DOS-drømme?
Jooh, og Pascaldrømme og Basic/Comaldrømme og ...
Post by Klaus Alexander Seistrup
· http://stackoverflow.com/questions/1335507/keyboard-input-with-timeout-in-python/3911477#3911477
Jamen, der er jo de to kommandoer! Jeg kendte blot ikke modulet
msvcrt.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
Loading...