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.
Timer für readline
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.
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.
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.
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.
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()`?ice2k3 hat geschrieben:Statt dieser Funktion solltest du immer raw_input() bzw. input() bei Python 3 verwenden.
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?
leider benutze ich kein linux sondern windows2000. gibt es da auch eine möglichkeit?
Pseudo:
quick and dirty
Code: Alles auswählen
starttime
while True:
read
if timenow - starttime > timeout
break
@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.
@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.
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
Es heiß auch raw_input bzw. ab Python 3.0 input.Maks81 hat geschrieben:raw_inout wollte ich als erstes verwenden, das wurde aber von dem verwendeten tool nicht akzeptiert (exception or syntax/intention error!?).
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.glaslos hat geschrieben:quick and dirty
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Mmh, das macht raw_input doch auch?lunar hat geschrieben:Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Er redet doch von raw_input.Rebecca hat geschrieben:Mmh, das macht raw_input doch auch?lunar hat geschrieben:Außerdem benutzt es unter Unix-Systemen automatisch "readline", wenn dieses Modul vor dem Aufruf der Funktion importiert wurde.
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
Zur Klarstellung: "sys.stdin.readline()" verwendet "readline" nicht, das tut nur "raw_input()". Entschuldigung für die Verwirrung.
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
Zur Klarstellung: "sys.stdin.readline()" verwendet "readline" nicht, das tut nur "raw_input()". Entschuldigung für die Verwirrung.
Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.cofi hat geschrieben:Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.glaslos hat geschrieben:quick and dirty
Das tut dein Programm aber nicht, da "read()" blockierend ist.glaslos hat geschrieben:Er möchte doch die Eingabe, jedoch mit Timeout. Sprich: Nach z.B. 2 Minuten soll das Programm mit der Nachricht: "Keine Eingabe" weiterlaufen.cofi hat geschrieben:Sehr dirty. IMHO loest es auch gar nicht das Problem, da trotzdem auf die Eingabe gewartet wird.glaslos hat geschrieben:quick and dirty
Hier eine Thread-Variante:
http://code.activestate.com/recipes/473878/
Oder noch besser als Dekorator:
http://code.activestate.com/recipes/483752/
http://code.activestate.com/recipes/473878/
Oder noch besser als Dekorator:
http://code.activestate.com/recipes/483752/
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.
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
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
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.
Versuch das mal mit subprocess zu implementieren, damit müsste es gehen.