J'utilise la commande --pdb
avec ipython, donc quand je débogue du code et qu'une erreur survient, elle affiche une trace de pile. Beaucoup de ces erreurs proviennent de l'appel de fonctions numpy ou pandas avec de mauvaises entrées. la trace de la pile commence à l'image la plus récente, en code à partir de ces bibliothèques. 5-10 répétitions de la commande up
plus tard, je peux réellement voir ce que j'ai fait de mal, ce qui sera immédiatement évident 90% du temps (par exemple, appeler avec une liste au lieu d'un tableau).Démarrer le débogueur python dans la plus ancienne pile après une exception
Y a-t-il un moyen de spécifier à quelle image de pile le débogueur commence-t-il initialement? Soit le cadre de pile le plus ancien, soit le cadre de pile le plus récent dans le fichier python initialement lancé, ou similaire. Ce serait beaucoup plus productif pour le débogage.
Voici un exemple simple
import pandas as pd
def test(df): # (A)
df[:,0] = 4 #Bad indexing on dataframe, will cause error
return df
df = test(pd.DataFrame(range(3))) # (B)
résultant retraçage, (A), (B), (C) ajouté pour plus de clarté
In [6]: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-66730543fac0> in <module>()
----> 1 import codecs, os;__pyfile = codecs.open('''/tmp/py29142W1d''', encoding='''utf-8''');__code = __pyfile.read().encode('''utf-8''');__pyfile.close();os.remove('''/tmp/py29142W1d''');exec(compile(__code, '''/test/stack_frames.py''', 'exec'));
/test/stack_frames.py in <module>()
6
7 if __name__ == '__main__':
(A)----> 8 df = test(pd.DataFrame(range(3)))
/test/stack_frames.py in test(df)
2
3 def test(df):
(B)----> 4 df[:,0] = 4
5 return df
6
/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in __setitem__(self, key, value)
2355 else:
2356 # set column
-> 2357 self._set_item(key, value)
2358
2359 def _setitem_slice(self, key, value):
/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in _set_item(self, key, value)
2421
2422 self._ensure_valid_index(value)
-> 2423 value = self._sanitize_column(key, value)
2424 NDFrame._set_item(self, key, value)
2425
/usr/local/lib/python2.7/dist-packages/pandas/core/frame.pyc in _sanitize_column(self, key, value)
2602
2603 # broadcast across multiple columns if necessary
-> 2604 if key in self.columns and value.ndim == 1:
2605 if (not self.columns.is_unique or
2606 isinstance(self.columns, MultiIndex)):
/usr/local/lib/python2.7/dist-packages/pandas/indexes/base.pyc in __contains__(self, key)
1232
1233 def __contains__(self, key):
-> 1234 hash(key)
1235 # work around some kind of odd cython bug
1236 try:
TypeError: unhashable type
> /usr/local/lib/python2.7/dist-packages/pandas/indexes/base.py(1234)__contains__()
1232
1233 def __contains__(self, key):
(C)-> 1234 hash(key)
1235 # work around some kind of odd cython bug
1236 try:
ipdb>
maintenant idéalement, je voudrais que le débogueur pour commencer dans la deuxième image la plus ancienne en (B), ou même en (A). Mais certainement pas à (C) où il va par défaut.
http: // stackoverflow.com/questions/37069323/stop-at-exception-in-my-not-bibliothèque-code peut être liée. –