Question

Si j'ai un programme où stdout est redirigé, mon pdb invite tous aller à la redirection, parce que la bibliothèque a été écrit pour écrire stdout.

Très souvent ce problème est subtile, me faisant de penser qu'un programme est suspendu quand il attend vraiment entrée.

Comment les gens travaillent autour de cette? (Malheureusement, l'utilisation d'autres débogueurs comme Winpdb est pas une option).

Était-ce utile?

La solution

Le problème est ici qui utilise PDB classe Cmd où par défaut:

use_rawinput = 1

Cela signifie que Cmd utilisera la méthode de raw_input() par défaut au lieu de sys.stdout.readline() à lire à partir de la console. Cela se fait parce que raw_input() prend en charge l'histoire (uniquement si le module de readline est chargé) et d'autres bits utiles. Le seul problème est que raw_input() ne prend pas en charge la redirection, donc si vous avez un script:

#!/usr/bin/python
name=raw_input("Enter your name: ")

et exécutez

> python test.py
Enter your name: Alex

mais, si vous l'exécutez avec la redirection de sortie, il sera bloqué

> python test.py | tee log

est exactement ce que l'APB utilise et pourquoi il est coincé aussi. Comme je l'ai mentionné sys.stdin.readline() en charge la redirection et si vous réécrire le script ci-dessus en utilisant readline() il devrait fonctionner.

Retour tout ce que vous devez faire à la question initiale est de dire Cmd de ne pas utiliser raw_input():

Cmd.use_rawinput = 0

ou

pdb = pdb.Pdb()
pdb.use_rawinput=0
pdb.set_trace()

Autres conseils

Cette réponse est juste pour compléter Ned, comme un moyen d'envelopper la fonction main() de pdb.py d'une manière qui ne nécessite pas la copie 40 lignes juste pour changer un d'entre eux:

# sane_pdb.py: launch Pdb with stdout on original
import sys, pdb
def fixed_pdb(Pdb=pdb.Pdb):
    '''make Pdb() tied to original stdout'''
    return Pdb(stdout=sys.__stdout__)

if __name__ == '__main__':
    pdb.Pdb = fixed_pdb
    pdb.main()

Je ne sais pas si cela fonctionne réellement pour le problème de l'interlocuteur, mais il fait ce que Ned décrit ...

Si vous invoquez pdb dans le code, vous pouvez passer votre propre stdout dans le constructeur. sys.__stdout__ pourrait être un bon choix.

Si vous invoquez pdb à partir de la ligne de commande, vous pouvez copier la fonction main() de pdb.py dans votre propre sane_pdb.py. Modifiez ensuite l'initialisation PDB () à:

pdb = Pdb(stdout=sys.__stdout__)

Ensuite, vous pouvez invoquer sane_pdb.py au lieu de pdb.py. Ce n'est pas génial que vous auriez à copier 40 lignes dans votre propre fichier juste pour changer un d'entre eux, mais il est une option.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top