Запустите pdb без stdin/stdout, используя FIFO

Я разрабатываю файловую систему FUSE с помощью python. Проблема в том, что после монтирования файловой системы у меня нет доступа к stdin/stdout/stderr из моего скрипта fuse. Я ничего не вижу, даже трассировки. Я пытаюсь запустить pdb следующим образом:


import pdb
pdb.Pdb(None, open('pdb.in', 'r'), open('pdb.out', 'w')).set_trace()

Все работает, но очень неудобно. Я хочу сделать pdb.in и pdb.out как файлы fifo, но не знаю, как правильно их подключить. В идеале я хочу вводить команды и видеть вывод в одном терминале, но буду счастлив даже с двумя терминалами (в одном помещать команды и видеть вывод в другом). Вопросы:

1) Лучше/другой способ запустить pdb без stdin/stdout?

2) Как я могу перенаправить stdin на pdb.in fifo (все, что я набираю, должно идти на pdb.in)? Как я могу перенаправить pdb.out на стандартный вывод (у меня были странные ошибки с «cat pdb.out», но, возможно, я чего-то не понимаю)


person Mykola Kharechko    schedule 23.06.2010    source источник


Ответы (3)


Ok. Именно то, что я хочу, было сделано в http://pypi.python.org/pypi/rpdb/0.1.1 .

person Mykola Kharechko    schedule 30.06.2010

Перед запуском приложения Python

mkfifo pdb.in
mkfifo pdb.out

Затем, когда вызывается pdb, вы можете взаимодействовать с ним, используя эти две команды cat, одна из которых работает в фоновом режиме.

cat pdb.out & cat > pdb.in

Обратите внимание, что поддержка readline не работает (например, стрелка вверх).

person rstonehouse    schedule 01.09.2012

Я только что столкнулся с аналогичной проблемой в гораздо более простом варианте использования:

  • отладить простую программу на Python, работающую из командной строки, в которой файл был передан в sys.stdin, что означает отсутствие возможности использовать консоль для pdb.

В итоге я решил это, используя wdb.

Краткое изложение для моего варианта использования. В оболочке установите сервер wdb и клиент wdb:

pip install wdb.server wdb

Теперь запустите сервер wdb с помощью:

wdb.server.py

Теперь вы можете перейти на localhost:1984 с помощью браузера и увидеть интерфейс со списком всех запущенных программ Python. На странице проекта wdb выше есть инструкции о том, что вы можете сделать, если хотите отладить любую из этих запущенных программ.

Что касается программы под вашим контролем, вы можете отладить ее с самого начала с помощью:

wdb myscript.py --script=args < and/stdin/redirection

Или в своем коде вы можете сделать:

import wdb; wdb.set_trace()

Это откроет интерфейс в вашем браузере (если он локальный), показывающий отслеживаемую программу.

Или вы можете перейти к порту wdb.server.py, чтобы увидеть все текущие сеансы отладки в верхней части списка запущенных программ Python, которые затем можно использовать для доступа к определенному сеансу отладки, который вы хотите.

Обратите внимание, что команды для навигации по коду во время трассировки отличаются от стандартных pdb, например, чтобы войти в функцию, вы используете .s вместо s, а для перехода используйте .n вместо n. Подробнее см. wdb README по ссылке выше.

person LeoRochael    schedule 31.03.2016