Как внедрить pdb в скрипты Python? - PullRequest
4 голосов
/ 03 февраля 2011

Я работаю над проектом django, у которого есть большой прибор, который не загружается:

$ python manage.py loaddata apps/mainsite/fixtures/test_auctions.json 
/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/db/models/fields/subclassing.py:80: DeprecationWarning: A Field class whose get_db_prep_save method hasn't been updated to take a `connection` argument.
  new_class = super(SubfieldBase, cls).__new__(cls, name, bases, attrs)
/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/db/models/fields/subclassing.py:80: DeprecationWarning: A Field class whose get_db_prep_lookup method hasn't been updated to take `connection` and `prepared` arguments.
  new_class = super(SubfieldBase, cls).__new__(cls, name, bases, attrs)
/Users/cp/bidsite/.ve/lib/python2.6/site-packages/celery/task/schedules.py:5: DeprecationWarning: celery.task.schedules is deprecated and renamed to celery.schedules
  "celery.task.schedules is deprecated and renamed to celery.schedules"))
Problem installing fixture 'apps/mainsite/fixtures/test_auctions.json': Traceback (most recent call last):
  File "/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/core/management/commands/loaddata.py", line 174, in handle
    obj.save(using=using)
  File "/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/db/models/base.py", line 570, in save_base
    created=(not record_exists), raw=raw, using=using)
  File "/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 172, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/Users/cp/bidsite/apps/mainsite/models.py", line 257, in update_auction_details
    auction_json = instance.as_json()
  File "/Users/cp/bidsite/apps/mainsite/models.py", line 1110, in as_json
    'product': self.product.as_json(),
  File "/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/db/models/fields/related.py", line 315, in __get__
    rel_obj = QuerySet(self.field.rel.to).using(db).get(**params)
  File "/Users/cp/bidsite/.ve/lib/python2.6/site-packages/django/db/models/query.py", line 349, in get
    % self.model._meta.object_name)
DoesNotExist: Product matching query does not exist.

Проблема в том, что трассировка стека не дает мне никакого представления о том, какая строка на приборе вызывает эту ошибку. Как я могу отладить это? Единственное, о чем я могу подумать, это то, что в ipythgon есть функция, когда всякий раз, когда вы выполняете что-либо, и возникает исключение, ipython автоматически вводит приглашение pdb, чтобы вы могли обойти, чтобы выяснить, что произошло. Как я могу сделать это с этим? Есть ли переключатель командной строки для Python, который делает это? Что я мог сделать здесь, чтобы отладить это?

1 Ответ

6 голосов
/ 03 февраля 2011

Этот Рецепт Python установит отладчик, который запускается на необработанных исключениях:

http://code.activestate.com/recipes/65287-automatically-start-the-debugger-on-an-exception/

Суть его заключается в установке ловушки исключений в sys.excepthook, которая вызывает pdb.pm() при вызове (хотя это немного сложнее).

...