2011-02-28 9 views
6

Soy consciente de que raw_input no se puede usar en retorcido. Sin embargo, esta es mi aplicación deseada.¿Cómo puedo usar un raw_input con twisted?

Tengo una pieza de hardware que proporciona un puerto serie de terminal interactivo. Estoy tratando de conectarme a este puerto y enviar comandos de manera asíncrona. Lo necesito de esta manera porque este es un controlador de motor que una vez que emita un comando, se "bloqueará" y se escapará (mi código actual). Necesito poder ingresar otro comando como ESTOP en caso de problemas o peligro.

He leído algunas cosas sobre twisted.internet.stdio.StandardIO sin embargo no he tenido mucha suerte .. Cualquier consejo/ayuda en esto sería genial.

Respuesta

7

Tiene un par de opciones aquí que puede usar. Uno sería usar un proceso hijo para manejar la comunicación con el puerto serie y un conducto para comunicarse entre el padre y el hijo (lo que se simplifica mediante el protocolo de proceso de Twisted). Otra es crear un subproceso separado de Python y usar raw_input desde allí. Los mecanismos de comunicación entre hilos normales funcionan bien con Twisted. El único giro real proviene de cómo se despierta el reactor retorcido del hilo separado. El mecanismo principal compatible para esto es usar reactor.callFromThread(). El uso de hilos en Twisted requiere una reflexión cuidadosa y es fácil de arruinar (por lo que generalmente se desaconseja) pero ocasionalmente es la herramienta adecuada para el trabajo.

3

¿Has visto los ejemplos de StandardIO? Hay un par en el Twisted core examples, stdin.py y stdiodemo.py. Hay a more advanced example que implica edición de línea e historial en Twisted Conch. Puede ejecutar este con python -m twisted.conch.stdio para verlo en acción. El ejemplo de Conch probablemente solo funcione en plataformas POSIX, no en Windows.

+0

Los ejemplos stdin.py y stdiodemo.py son muy rudimentarios. Por ejemplo, no muestran cómo hacer la edición de línea, el historial, la finalización de pestañas u otras características a las que uno está acostumbrado desde las interfaces de readline. El ejemplo avanzado solo muestra ConsoleManhole. ¿Qué pasa si quiero ingresar comandos personalizados que no sean de código python? ¿Y qué hace TerminalProcessProtocol en el código? No parece estar referenciado en ninguna parte. – blubberdiblub

+0

Eso es verdad. Tal vez quiera hacer una pregunta por su cuenta ... –

+0

Sí, podría eventualmente. Pero primero voy a tratar de pelear con retorcido y leer yo mismo (que es por eso que estaba buscando tutoriales adecuados) y si eso no da fruto, probablemente pueda formarse una pregunta sobre dónde me quedé atrapado. – blubberdiblub

Cuestiones relacionadas