ver uso usar ultima tutorial todos texto sirve reemplazar que punto para pantalla mayor los linea limpiar libro introduccion interrupcion interprete insertar imprimir gran filtrar explorando examples español ejemplos ejemplo developing depurar debug datos contenido contador con como comando codigos code biblia avanzado archivo anotaciones agregar python stdin pdb command-line-interface command-line-tool

uso - ¿Cómo depurar el CLI de python que toma stdin?



uso del comando cut en unix (4)

Cuando usas pdb (o cualquier otro depurador de Python), adquiere stdin para los comandos de depuración, por eso obtienes NameError: name ''test'' is not defined .

Por ejemplo, este comando saldrá del depurador al inicio de un tiempo de ejecución y no obtendrá este error (ni la depuración interactiva) para una ejecución:

(eco cont; eco "prueba") | python -m pdb mytool.py

Estoy intentando depurar un CLI de Python que escribí que puede tomar sus argumentos desde stdin. Un caso de prueba simple tendría la salida de

echo "test" | python mytool.py

ser equivalente a la salida de

python mytool.py test

Me gustaría depurar algunos problemas con esta herramienta, así que intenté ejecutar esto:

echo "test" | pdb mytool.py

Pero obtengo esta salida, luego pdb sale:

> /path/to/mytool.py(5)<module>() -> '''''' (Pdb) *** NameError: name ''test'' is not defined (Pdb)

Lo mismo ocurre cuando agrego -m python al shebang, y si ejecuto pdb.set_trace() dentro del script.

¿Que está pasando aqui?


Otra opción es crear tu propio objeto Pdb y establecer allí la entrada estándar y la salida estándar. Mi prueba de concepto involucra 2 terminales, pero seguro que algunos trabajos pueden combinarse con algún tipo de servidor de red poco seguro.

  1. Cree dos fifos: mkfifo fifo_stdin mkfifo fifo_stdout

  2. En una terminal, abra la cat fifo_stdout & cat > fifo_stdin estándar en el fondo y escriba a stdin: cat fifo_stdout & cat > fifo_stdin

  3. En su código / consola de Python, cree el objeto pdb y utilícelo: import pdb mypdb=pdb.Pdb(stdin=open(''fifo_stdin'',''r''), stdout=open(''fifo_stdout'',''w'')) ... mypdb.set_trace() ...
  4. ¡Lucro!

Debería poder usar pdb en la primera consola.

El único inconveniente es tener que usar su pdb personalizado, pero algunos parches de mono en init (PYTHONSTARTUP o similar) pueden ayudar:

import pdb mypdb=pdb.Pdb(stdin=open(''fifo_stdin'',''r''), stdout=open(''fifo_stdout'',''w'')) pdb.set_trace=mydbp.set_trace


Puedes usar otro descriptor de archivo. Con bash puedes crear un nuevo descriptor de archivo con:

exec 3<> test.txt

Y luego en tu archivo python tienes algo como:

#!/usr/bin/python # Use fd 3 as another stdin file. import os stdin=os.fdopen(3) while True: s=stdin.readline() import pdb; pdb.set_trace() print len(s)

Solo ejecutando su script usará ese test.txt como entrada, y puede usar stdin en stdin. Se puede utilizar también con tuberías si es necesario.


Tu control TTY sigue siendo un terminal, ¿verdad? Use esto en lugar de pdb.set_trace .

def tty_pdb(): from contextlib import (_RedirectStream, redirect_stdout, redirect_stderr) class redirect_stdin(_RedirectStream): _stream = ''stdin'' with open(''/dev/tty'', ''r'') as new_stdin, / open(''/dev/tty'', ''w'') as new_stdout, / open(''/dev/tty'', ''w'') as new_stderr, / redirect_stdin(new_stdin), / redirect_stdout(new_stdout), redirect_stderr(new_stderr): __import__(''pdb'').set_trace()

No he conseguido readline para autocompletar en estas circunstancias. La flecha hacia arriba tampoco funcionará, o cualquier otra de las sutilezas de la línea de lectura.