Timer für readline

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.
Maks81
User
Beiträge: 4
Registriert: Dienstag 28. Juli 2009, 16:28

hallo!

gibt es eine einfache möglichkeit um zu der readline funktion einen timer hinzuzufügen? mein ziel ist es das skript weiterlaufen zu lassen wenn nach einer gewissen zeit keine eingabe erfolgt, so dass nicht für ewig auf eine eingabe gewartet wird.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Meinst du mit der "readline-Funktion" "raw_input"(/"input")?

Und: warum soll es immer eine einfach Möglichkeit sein? ^^
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht empfängt er auch irgendwelche Daten über's Netzwerk, die in regelmäßigen Abständen gelesen werden. Ich bin heute wieder in Hellseher-Laune. :)
Maks81
User
Beiträge: 4
Registriert: Dienstag 28. Juli 2009, 16:28

es werden ein paar kommandos an ein gerät gesendet. danach um der nutzer zu gefragt ob visuel das erwartete ergebnis eintritt oder nicht. Um die eingabe zu erfassen wird folgende funktion benutzt

interaction = sys.stdin.readline()
...

es soll also nur ja oder nein eingegeben werden. soweit läuft auch alles, nur sollte das skript eben nach einiger zeit - mit einer fehlerausgabe - weiterlaufen auch wenn keine eingabe erfolgt und das nächste script starten.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Statt dieser Funktion solltest du immer raw_input() bzw. input() bei Python 3 verwenden.

Für dein Problem kannst du z.B. das Modul ``signal`` nutzen.
(Funktioniert aber nur unter Linux)
Alternativ kannst du mit Threads arbeiten, da kann man Timeouts verwenden.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

ice2k3 hat geschrieben:Statt dieser Funktion solltest du immer raw_input() bzw. input() bei Python 3 verwenden.
Soll man das eigentlich machen, weil man es so macht (ist ja auch kürzer) oder hat es noch andere Vorteile gegenüber `sys.stdin.readline()`?
Maks81
User
Beiträge: 4
Registriert: Dienstag 28. Juli 2009, 16:28

raw_inout wollte ich als erstes verwenden, das wurde aber von dem verwendeten tool nicht akzeptiert (exception or syntax/intention error!?).

leider benutze ich kein linux sondern windows2000. gibt es da auch eine möglichkeit?
glaslos
User
Beiträge: 23
Registriert: Donnerstag 12. Februar 2009, 18:55
Kontaktdaten:

Pseudo:

Code: Alles auswählen

starttime
while True:
    read
    if timenow - starttime > timeout
        break
quick and dirty :)
lunar

@Maks81: Jedes normale Python 2.x unterstützt "raw_input()" unabhängig vom verwendeten Betriebsystem. Wenn also "raw_input()" nicht funktioniert, war das mit Sicherheit dein Fehler.

@snafu:
"raw_input()" wirft "EOFError", wenn der Nutzer ein EOF-Signal auslöst (in der Regel über Strg+D), "sys.stdin.readline()" gibt in diesem Fall dagegen eine leere Zeichenkette zurück. Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Maks81 hat geschrieben:raw_inout wollte ich als erstes verwenden, das wurde aber von dem verwendeten tool nicht akzeptiert (exception or syntax/intention error!?).
Es heiß auch raw_input bzw. ab Python 3.0 input.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

glaslos hat geschrieben:quick and dirty :)
Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

lunar hat geschrieben:Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
Mmh, das macht raw_input doch auch?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Rebecca hat geschrieben:
lunar hat geschrieben:Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
Mmh, das macht raw_input doch auch?
Er redet doch von raw_input.
lunar

Eigentlich nicht ;) Streng grammatikalisch gesehen ist "es" ein relativer Satzanschluss und bezieht sich damit auf das Subjekt des vorherigen Satzes. Eine schöne grammatikalische Konstruktion, die es erlaubt, Sätze zu schreiben, bei denen jeder rauslesen kann, was ihm gerade passt ;)

Im Ernst, der Satz sollte sich wirklich auf raw_input() beziehen, der vorherige Satz über "sys.stdin.readline()" eigentlich ans Ende des Postings kommen ... ich habe wohl schneller geschrieben als gedacht :oops:

Zur Klarstellung: "sys.stdin.readline()" verwendet "readline" nicht, das tut nur "raw_input()". Entschuldigung für die Verwirrung.
glaslos
User
Beiträge: 23
Registriert: Donnerstag 12. Februar 2009, 18:55
Kontaktdaten:

cofi hat geschrieben:
glaslos hat geschrieben:quick and dirty :)
Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.
Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.
lunar

glaslos hat geschrieben:
cofi hat geschrieben:
glaslos hat geschrieben:quick and dirty :)
Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.
Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.
Das tut dein Programm aber nicht, da "read()" blockierend ist.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Hier eine Thread-Variante:
http://code.activestate.com/recipes/473878/

Oder noch besser als Dekorator:
http://code.activestate.com/recipes/483752/
lunar

Das kann imho nicht richtig funktionieren. Der Code bricht die Funktion ja nicht ab, sondern lässt sie im Hintergrund weiterlaufen. Daher kann man in einem Programm exakt ein einziges Mal auf diese Weise eine Eingabe abfragen. Springt dann der Timeout an, bleibt die Standardeingabe durch den Thread blockiert. Jede weitere Eingabe geht also erstmal an die Funktion im Thread, und verschwindet damit faktisch im Nirvana.
Maks81
User
Beiträge: 4
Registriert: Dienstag 28. Juli 2009, 16:28

glaube ich habe ein lösung gefunden:

import sys
import threading
interaction=""
def input():
global interaction
interaction = sys.stdin.readline()
...
T = threading.Thread(target=input)
T.start()
T.join(120)
if interaction:
...

scheint zu funktionieren.
habe hier auch raw_input() nochmal ausprobiert, hat auch funktioniert
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Nein das funktioniert nicht, weil der Thread immer noch blockiert und somit den nächsten Input einfach dem Mainthread "klaut" (wie lunar schon beschrieben).
Versuch das mal mit subprocess zu implementieren, damit müsste es gehen.
Antworten