Próbuję zezwolić użytkownikowi na wprowadzanie poleceń na konsoli przy użyciu metody raw_input(), to działa poprawnie. Problem polega na tym, że mam wątki w tle, które sporadycznie wyprowadzają informacje dziennika na ekran, a kiedy to robią, zepsuły monit wejściowy (ponieważ dane wyjściowe są przesyłane tam, gdzie aktualnie znajduje się kursor).Odczytanie danych wejściowych z trybu raw_input() bez konieczności zastąpienia przez inne wątki w Pythonie
To jest mały program w języku Python, który ilustruje, co mam na myśli.
#!/usr/bin/env python
import threading
import time
def message_loop():
while True:
time.sleep(1)
print "Hello World"
thread = threading.Thread(target = message_loop)
thread.start()
while True:
input = raw_input("Prompt> ")
print "You typed", input
To jest przykład co to może wyglądać, gdy uruchomię go:
Prompt> Hello World
Hello World
Hello World
Hello World
test
You typed test
Prompt> Hello World
Hello World
Hello World
hellHello World
o
You typed hello
Prompt> Hello World
Hello World
Hello World
Hello World
Co chcę jest dla zachęty, aby przejść wraz z wyjściem z wątku. Podobnie jak:
Hello World
Hello World
Prompt> test
You typed test
Hello World
Hello World
Hello World
Hello World
Hello World
Prompt> hello
You typed hello
Hello World
Hello World
Hello World
Hello World
Prompt>
Jakieś pomysły, jak to osiągnąć bez uciekania się do brzydkich hacków? :)
To jest dokładnie to, czego szukałem. Dzięki :) – Jim
[Moduł "błogosławieństwo"] (https://pypi.python.org/pypi/blessings/) pozwala sformatować wyjście i poruszać się bez sięgania zbyt głęboko do wnętrzności terminala. – jfs
Uwaga, w niektórych wersjach Pythona to się psuje, jeśli terminal jest zmieniany w czasie wykonywania z powodu błędu w module 'readline', który powoduje, że ignoruje on zdarzenia zmiany rozmiaru terminala (więc nie zmienia odpowiednio rozmiaru wewnętrznego bufora, co powoduje uszkodzenie kolumny logika liczenia). Zobacz https://bugs.python.org/issue23735. Na szczęście wygląda to na poprawione w Pythonie 3.5. Odpowiedź kick-ass inaczej :) – Thomas