Выполнять команды пользовательского ввода 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
список очищается, и вы должны повторно заполнить его любыми новыми командами, которые вам нужны, чтобы выполнить вторую трассировку из этого экземпляра.