Выполнять команды пользовательского ввода pdb или ipdb программно в Python

Я работаю с приложением PyQt, поэтому перед началом отладки в файле Python у меня есть строки pyqtRemoveInputHook() чтобы остановить цикл событий, а затем ipdb.set_trace(), Это входит в интерактивный сеанс отладки через терминал. Когда закончите отладку, мне нужно вручную ввести в терминал c; pyqtRestoreInputHook() продолжить выполнение программы и восстановить цикл обработки событий. c говорит ipdb или же pdb продолжить и pyqtRestoreInputHook() интерпретируется как код Python. Хотя это не слишком сложно, я бы хотел как-то создать функцию, которая позволит командам Python сообщать ipdb или же pdb что данная строка была командой псевдо-клавиатуры.

Другими словами, я пытаюсь найти функцию, которая в основном ipdb.run_user_input(my_string) где my_string может быть любым нормальным ipdb или же pdb функции как next, c, step, list, так далее.

Спасибо!

1 ответ

Я искал что-то подобное, но не похоже, чтобы pdb позволял программно запускать последовательность команд pdb.

Тем не менее, он позволяет вам читать последовательность команд pdb из файла, которые выполняются немедленно при входе в любой сеанс pdb.

К счастью, согласно документации :

Функции run* и set_trace() являются псевдонимами для создания экземпляра класса Pdb и вызова одноименного метода.

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

Поэтому достаточно написать .pdbrcфайл в текущем каталоге непосредственно перед вызовом pdb.set_trace, содержащий последовательность интересующих вас команд. Например,

      import pdb;

with open( '.pdbrc', 'w') as f: 
    print( "print('Hello from pdbrc')", file = f )
    print( "continue", file = f )

pdb.set_trace()

with open( '.pdbrc', 'w') as f:
    print( "print('Hello again!')", file = f )

pdb.set_trace()

В приведенном выше примере первый должен напечатать «Hello from pdbrc» и немедленно продолжить выполнение программы, а затем второй pdb.set_trace()должен напечатать "Здравствуйте еще раз!" и оставаться в среде pdb.


Предупреждение: Если у вас есть файл .pdbrc в вашем домашнем каталоге, на который вы полагаетесь, убедитесь, что вы не собираетесь перезаписывать его (например, убедитесь, что у вас есть резервная копия).


UPDATE оказывается, что вы можете программно дописывать строки rc, что полностью избавляет от необходимости создавать файл на диске. Обратите внимание, что вы не можете сделать это напрямую в модуле, вам нужно создать Pdbсначала экземпляр класса.

      import pdb
pdb = pdb.Pdb()   # or pdb = pdb.Pdb( readrc = False )  if you want to ignore your existing .pdbrc
pdb.rcLines.append( "print('Hellooo')" )
pdb.rcLines.append( "continue" )
pdb.set_trace()

Преимущество этого в том, что если вы не вызываете с помощью readrc = Falseаргумент, ваш существующий файл .pdbrc будет учитываться, и любые команды, которые вы добавляете программно, будут фактически добавлены к командам, производным от pdbrc.

Однако обратите внимание, что по какой-то причине после успешной первой трассировки через этот pdb например , pdb.rcLinesсписок очищается, и вы должны повторно заполнить его любыми новыми командами, которые вам нужны, чтобы выполнить вторую трассировку из этого экземпляра.

Другие вопросы по тегам