El jue., 27 sept. 2018 a las 2:56, Miguel de Dios Matias (<
tres.14...@gmail.com>) escribió:

> Buenas.
>
> Ahora ando intentandolo otra vez con popen, mas o menos no consigo leer
> pero me falla el envió de datos por stdin.
>
> Saludos.
>
> El mar., 25 sept. 2018 a las 18:44, Chema Cortes (<pych...@gmail.com>)
> escribió:
>
>>
>>
>> El lun., 24 sept. 2018 a las 16:30, Miguel de Dios Matias (<
>> tres.14...@gmail.com>) escribió:
>>
>>> Buenas.
>>>
>>> Ando pegándome en intentar "encapsular" un ejecutable (un viejo
>>> roguelike) que saca la salida en ncurses y se interacciona con pulsaciones
>>> de teclado.
>>>
>>> Me he hecho un script sencillo en ncurses para probar (este espera la
>>> pulsación y muestra la tecla pulsada y si es q se sale).
>>>
>>
>> ¿Exactamente, qué esperabas que hiciera? Las entradas y salidas estándar
>> funcionan con buffers, no son adecuadas para programas interactivos.
>>
>> De alguna forma tendrás que exponer el interface curses de la aplicación
>> para que sea accesible por tu script de testing.
>>
>>
>>>
>>> ----
>>> import sys,os
>>> import curses
>>>
>>> def draw_menu(stdscr):
>>>    k = 0
>>>    while (k != ord('q')):
>>>       stdscr.clear()
>>>       height, width = stdscr.getmaxyx()
>>>       stdscr.addstr(0, 0, "HOLA {}".format(k))
>>>       stdscr.refresh()
>>>
>>>       k = stdscr.getch()
>>>
>>> def main():
>>>    curses.wrapper(draw_menu)
>>>
>>> if __name__ == "__main__":
>>>    main()
>>> ----
>>>
>>> Y he probado con popen, pexpect y me falta sacrificar una cabra...no lo
>>> saco, aquí mis intentos infructuosos:
>>>
>>> ----
>>>
>>> """
>>> ps -A | grep cata
>>> xdotool search --pid 3819
>>> xdotool key --window 50331670 q
>>> """
>>>
>>> """
>>> from subprocess import Popen, PIPE
>>>
>>> #p = Popen('./test5.py', stdin=PIPE, stdout=PIPE, shell=True)
>>> #p = Popen('./test5.py', shell=True)
>>> p = Popen('./test2.py')
>>>
>>> print(p.pid)
>>>
>>> sleep(100)
>>>
>>> # p.stdin.close()
>>> # p.stdout.close()
>>> # p.wait()
>>>
>>> """
>>>
>>>
>>> # ~ import pexpect
>>>
>>> # ~ child = pexpect.spawn("./test5.py")
>>> # ~ child.send('a')
>>> # ~ child.send('b')
>>> # ~ child.interact()
>>>
>>>
>>> # ~ import sys
>>> # ~ import pexpect
>>> # ~ child = pexpect.spawn('./test5.py', logfile=open("/tmp/file", "wb"))
>>> # ~ child.logfile = open("/tmp/file", "wb")
>>> # ~ child.expect(pexpect.EOF)
>>> # ~ child.send('a')
>>> # ~ child.send('q')
>>> # ~ child.interact()
>>>
>>> """
>>>
>>> https://stackoverflow.com/questions/2575528/simulating-key-press-event-using-python-for-linux
>>> spawn
>>> fout = file('output.txt', 'w') child.logfile = fout
>>> """
>>>
>>> import sys
>>> from time import sleep
>>> import pexpect
>>> child = pexpect.spawn('./test5.py')
>>> child.logfile = open("/tmp/file", "wb")
>>> sleep(2)
>>> child.send('a')
>>> print(child.read())
>>> # ~ child.send('q')
>>> ----
>>>
>>> Por si alguien le interesa el karma en stackoverflow, tengo la misma
>>> pregunta por allí, si contesta le voto positivo:
>>>
>>>
>>> https://stackoverflow.com/questions/52377179/open-a-process-and-catch-stdout-and-send-custom-keypress
>>>
>>> Y también por si alguno le ha picado la curiosidad tengo también un
>>> mensaje en el foro de referencia de videojuegos libres:
>>>
>>>
>>> https://forum.freegamedev.net/viewtopic.php?f=3&t=8113&sid=47af7f6dfc9848160f9ca27791a045f1
>>>
>>> Saludos.
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es@python.org
>>> https://mail.python.org/mailman/listinfo/python-es
>>>
>>
>>
>> --
>> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
>> https://blog.ch3m4.org
>> Buscador Python Hispano: http://busca.ch3m4.org
>> <https://blog.ch3m4.org/pages/busqueda-python-es/>
>> _______________________________________________
>> Python-es mailing list
>> Python-es@python.org
>> https://mail.python.org/mailman/listinfo/python-es
>
>

Ya encontré la solución (no por mi mismo hay que reconocer las fuentes), es
un tema de que el stdout se bloquea esperando la lectura, hay que setearlo
como no bloqueado. He escrito la solución en stackoverflow:
https://stackoverflow.com/questions/52377179/open-a-process-and-catch-stdout-and-send-custom-keypress


Y el código que "engrana" con las pruebas que hacia y os puse en el email:

import osimport fcntlimport subprocess
p = subprocess.Popen(['./test5.py'], stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
fd = p.stdout.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
p.stdout.read()

p.stdin.write(b'u')
p.stdin.flush()

p.stdout.read()

p.stdin.write(b'u')
p.stdin.flush()

p.stdout.read()
p.poll()

p.stdin.write(b'q')
p.stdin.flush()

p.poll()

Saludos.
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es

Responder a