2010-11-15 23 views
7

Je suis nouveau sur ipython et j'essaie d'utiliser ipython pour déboguer mon code. Je l'ai fait:accéder aux variables dans la session de débogage avec ipython et% pdb sur

[1]: %pdb 
Automatic pdb calling has been turned ON 

puis

In [2]: %run mycode.py 

et dans le code, j'ai 1/0 il déclenche une exception et sera passe automatiquement en la session de débogage.

ZeroDivisionError: float division 

ipdb> variable 
array([ 0.00704313, -1.34700666, -2.81474391]) 

Donc je peux accéder aux variables. Mais quand je fais ce qui suit:

ipdb> b = variable 
*** The specified object '= variable' is not a function or was not found along sys.path. 

Mais cela fonctionne:

ipdb> b = self.X 

Répondre

9

b est utilisé pour définir des points de rupture. Donc tout ce qui suit b devrait être une fonction ou un numéro de ligne.

Si vous tapez ipdb> help, vous verrez la liste complète des commandes (mots réservés).

Vous pouvez utiliser, par exemple, x ou y comme variable:

ipdb> y = variable 

ou

ipdb> exec 'b = variable' 
+0

Y at-il un moyen de surcharger cette commande b? Dans mon application, le nom de la variable b se produit beaucoup naturellement, et c'est une douleur de ne pas pouvoir l'utiliser. – joon

+0

@joon: Avoir des noms de variable à une lettre n'est généralement pas une bonne pratique de programmation. Peut-être que ce problème devrait vous motiver à changer le nom de la variable. Je réalise que cela peut être difficile à faire. Dans ce cas, vous pouvez essayer 'exec 'b = variable''. – unutbu

+2

Bien sûr. C'est juste le caractère b est le choix naturel pour la contrepartie mathématique. Je vous remercie! – joon

0

vous pouvez utiliser

locals()["b"] = variable 
1

Je pense que vous devez utiliser « ! ' (pdb documentation): ! instruction Exécute l'instruction (une ligne) dans le contexte du cadre de la pile en cours. Le point d'exclamation peut être omis à moins que le premier mot de l'instruction ne ressemble à une commande de débogueur. Pour définir une variable globale, vous pouvez préfixer la commande d'affectation avec une instruction globale sur la même ligne, par exemple:

global list_options; list_options = ['-l']