Подтвердить что ты не робот

Используйте pdb.set_trace() в script, который читает stdin через канал

У меня есть python script, который читает stdin через канал, и я не могу использовать его с pdb.set_trace().

my_script.py:

#!/usr/bin/env python
import sys
import pdb

def main():
    for line in sys.stdin:
        print "Printing a line: " +line

if __name__=='__main__':
    status = main()

Предположим, что tempfile.csv - это файл с двумя строками,

$ cat tempfile.csv 
line1
line2

то я могу запустить script с помощью: $ cat tempfile.csv |./my_script.py, и все в порядке:

$ cat tempfile.csv | ./my_script.py 
Printing a line:  line1

Printing a line:  line2

С другой стороны, если я помещаю pdb.set_trace() где-нибудь, я получаю сообщение об ошибке. Например, поместив pdb.set_trace() ниже def main(), я получаю

$ cat tempfile.csv | ./my_script.py 
> /home/ilangmore/mobiuss/TM/branches/hadooprotype/my_script.py(7)main()
-> for line in sys.stdin:
(Pdb) *** NameError: name 'line1' is not defined
(Pdb) *** NameError: name 'line2' is not defined
(Pdb) 
Traceback (most recent call last):
  File "./my_script.py", line 11, in <module>
    status = main()
  File "./my_script.py", line 7, in main
    for line in sys.stdin:
  File "./my_script.py", line 7, in main
    for line in sys.stdin:
  File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit

Обратите внимание, что мой вопрос, вероятно, связан с этим вопросом (т.е. pdb по умолчанию читает из stdin), но мне нужна дополнительная помощь.

4b9b3361

Ответ 1

Вот пример того, что сработало для меня:

lines = sys.stdin.readlines()
sys.stdin = open('/dev/tty')
pdb.set_trace()

Ответ 2

Дело в том, что cat не прекратит отправлять данные, потому что ваш script в настоящее время отлаживается. И когда вы собираетесь отслеживать, stdin все еще заполняется клавишей cat+. Вам нужно выбрать один из них.

Вы можете прочитать весь stdin, а затем set_trace() не будет заполнен stdin:

sys.stdin.read()
pdb.set_trace()

Ответ 3

Возможно, вам захочется посмотреть, как работает вкладчик Celd RDB (Remote Debugger):

https://github.com/celery/celery/blob/master/celery/contrib/rdb.py

Кажется, это связано с большой обработкой потока, но я его протестировал, и он работает, позволяя вам подключаться к новому локальному сетевому порту. Это не намного лучше ipdb, а просто pdb.

Ответ 4

Используя ripdb модуль (pip install ripdb) решил эту проблему для меня.

Ответ 5

Сегодня я столкнулся с этой точной проблемой. Я обнаружил, что Winpdb работает отлично.