Python: ¿Cómo obtener información de la consola mientras se está ejecutando un bucle infinito?

Estoy tratando de escribir un simple cliente IRC de Python. Hasta ahora puedo leer datos y puedo enviar datos al cliente si se automatiza. Estoy obteniendo los datos en un while True , lo que significa que no puedo ingresar texto al mismo tiempo que leo datos. ¿Cómo puedo ingresar texto en la consola, que solo se envía cuando presiono Intro, al mismo tiempo que se ejecuta un bucle infinito?

Estructura básica del código:

 while True: read data #here is where I want to write data only if it contains '/r' in it 

Otra forma de hacerlo es mediante hilos.

 import threading # define a thread which takes input class InputThread(threading.Thread): def run(self): self.daemon = True while True: self.last_user_input = input('input something: ') # do something based on the user input here # alternatively, let main do something with # self.last_user_input # main it = InputThread() it.start() while True: # do something # do something with it.last_user_input if you feel like it 

Lo que necesitas es un bucle de eventos de algún tipo.

En Python tienes algunas opciones para hacerlo, elige una que te guste:

y así sucesivamente, hay cientos de marcos para esto, también podría usar cualquiera de los marcos GUI como tkinter o PyQt para obtener un bucle de eventos principal.

Como se ha dicho anteriormente en los comentarios, puede utilizar subprocesos y algunas colas para manejar esto, o un bucle basado en eventos, o corrutinas o un montón de otras architectures. Dependiendo de sus plataformas de destino, una u otra podría ser la mejor. Por ejemplo, en Windows, la API de la consola es totalmente diferente a las ptys de Unix. Especialmente si más tarde necesitas cosas como la salida en color, etc., es posible que desees hacer preguntas más específicas.

Puede usar una biblioteca asíncrona (ver respuesta de schlenk) o usar https://docs.python.org/2/library/select.html

Este módulo proporciona acceso a las funciones select () y poll () disponibles en la mayoría de los sistemas operativos, epoll () disponible en Linux 2.5+ y kqueue () disponible en la mayoría de BSD. Tenga en cuenta que en Windows, solo funciona para sockets; en otros sistemas operativos, también funciona para otros tipos de archivos (en particular, en Unix, funciona en tuberías). No se puede usar en archivos regulares para determinar si un archivo ha crecido desde la última vez que se leyó.