2011-07-21 15 views
5

Supongamos que tengo un programa C++ simple que toma entradas y salidas de algunas cadenas. Al igual que este (programa real es mucho más complicado, pero aún en modo texto):Usando python para ejecutar un programa C++ y probarlo

$ ./game 
$ what kind of game? type r for regular, s for special. 
$ r 
$ choose a number from 1 - 10 
$ 1 
$ no try again 
$ 2 
$ no try again 
$ 5 
$ yes you WIN! 

No he utilizado Python antes, pero ¿es posible escribir un script en Python para ejecutar este programa, que se alimenta de entrada y salidas los resultados a la salida estándar? He hecho la pregunta here sobre ejecutarlo usando C++, pero parece demasiado complicado. Sería increíble que me pudieras dirigir a algunos ejemplos de código. Cualquier ayuda sería apreciada.

+0

Es posible que también desee considerar 'expect' (http://en.wikipedia.org/wiki/Expect) – aschepler

Respuesta

3

Use pexpect.

La tubería stdin/stdout normal normalmente no funciona, porque las instalaciones de biblioteca estándar en los procesos padre e hijo tienden a almacenar E/S más agresivamente cuando un descriptor de archivo no es TTY (a través de la llamada isatty). Obviamente, puede solucionar esto en el padre, ya que posee ese código; solo llame al color en los puntos apropiados. Pero a menudo el proceso secundario está ejecutando algún código preexistente que usted no posee. El módulo pexpect alimenta al proceso secundario una pseudo-tty, que engaña al niño haciéndole creer que está hablando con una consola. Este es el mismo truco que usan los terminales GUI como xterm y rxvt.

1

Puede que le interese Cram, que es una herramienta de Python para probar opciones de línea de comandos.

0

Si está preparado puede usar mi marco de prueba que incluye una versión de Python de expect. El programa original expect le permite "conversar" con programas interactivos así como así. Pero este marco incluye un módulo Python expect.py que puede usar en su lugar.

Ver http://code.google.com/p/pycopia/

El módulo se encuentra en el proceso de sub-paquete.

También podría usar pexpect, pero yo escribí el mío porque no me gustó.

Cuestiones relacionadas