ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как отлаживать Python с интерактивной консоли

Как отлаживать Python с интерактивной консоли

Введение

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

Полезный и быстрый инструмент для отладки является модуль code в Python, так как он может быть использован для эмуляции интерактивного интерпретатора. Модуль также предоставляет возможность экспериментировать с кодом , который вы пишете в Python.

Понимание модуля code

Вместо того, чтобы пройти через код с помощью отладчика, вы можете добавить модульcode в программу Python, чтобы настроить программу , остановить выполнение и ввести в интерактивный режим для того, чтобы изучить, как работает ваш код. Модуль code является частью стандартной библиотеки Python.

Это полезно, потому что вы можете использовать интерпретатор без ущерба сложности и неизменности, которое программирование могут обеспечить. Благодаря помощи модуля code вы можете избежать использования заявления print() на протяжении всей отладки кода, которая может стать громоздкой с течением времени.

Для того, чтобы использовать модуль в качестве метода для отладки, вы можете использовать функцию interact() модуля, который останавливает выполнение программы в точке, в которой она указывается, и предоставляет вам интерактивную консоль, так что вы можете проверить состояние вашей программы.

Функция с ее возможными параметрами являются следующие:

code.interact(banner=None, readfunc=None, local=None, exitmsg=None)

 

Эта функция запускает цикл read-eval-print и создает экземпляр объекта класса InteractiveConsole, который эмулирует поведение интерпретатора Python.

Необязательные следующие параметры:

С параметром local, вы можете использовать, например:

Обратите внимание, что параметр exitmsg является новым в Python 3.6, так что если вы используете старую версию Python, обновите его или укажите параметр exitmsg.

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

Работа с модулем code

Давайте посмотрим на это в контексте программы под названием balances.py. Мы зададим параметр local в locals() чтобы установить пространство имен для локальных.

balances.py

# Import code module
import code

bal_a = 2324
bal_b = 0
bal_c = 409
bal_d = -2

account_balances = [bal_a, bal_b, bal_c, bal_d]


def display_bal():
    for balance in account_balances:
        if balance < 0:
            print("Account balance of {} is below 0; add funds now."
                  .format(balance))

        elif balance == 0:
            print("Account balance of {} is equal to 0; add funds soon."
                  .format(balance))

        else:
            print("Account balance of {} is above 0.".format(balance))

# Use interact() function to start the interpreter with local namespace
code.interact(local=locals())

display_bal()

 

Мы использовали функцию code.interact() с параметром local=locals() использовать локальное пространство имен по умолчанию внутри цикла интерпретатора.

Давайте запустим программу выше, используя команду python3, если мы не в виртуальной среде, или иначе команду python:

python balances.py

 

После запуска программы, мы получим следующий результат:

Python 3.6.1 (default, Apr  4 2017, 09:40:51) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

 

Ваш курсор будет помещен в конце линии >>>, так же, как это было бы в интерактивной оболочке Python.

Здесь вы можете оформить вызовы для печати переменных, функций и т.д .:

>>> print(bal_c)
409
>>> print(account_balances)
[2324, 0, 409, -2]
>>> print(display_bal())
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.
None
>>> print(display_bal)
<function display_bal at 0x104b80f28>
>>>

 

Мы видим , что, используя локальное пространство имен, мы можем напечатать переменные и вызвать функцию. Окончательный вызова print() показывает местоположение функции display_bal в памяти компьютера.

Как только вы стали удовлетворены работой над изучением интерпретатора, вы можете нажать CTRL + D на * NIX системах или CTRL + Z для систем на базе Windows, чтобы оставить консоль и продолжить выполнение программы.

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

Для того, чтобы использовать параметры banner и exitmsg, мы можем выполнить следующее:

balances.py
...
# Use interact() function to start the interpreter
code.interact(banner="Start", local=locals(), exitmsg="End")

display_bal()

 

Когда мы запускаем программу, мы получим следующий результат:

Start
>>>

 

Используя параметр banner позволяет вам установить несколько точек в пределах вашего кода и даст вам возможность идентифицировать их. Например, вы можете использовать banner для печати "In for-loop" с  exitmsg  для печати "Out of for-loop", так что вы можете точно сказать, где вы находитесь в коде.

Отсюда, мы можем использовать интерпретатор, как обычно. После этого, когда мы наберем CTRL + D для выхода из интерпретатора, мы получим сообщение выхода и функция будет работать в обычном режиме:

End
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.

 

Программа теперь полностью работает после интерактивного сеанса.

После того, как вы закончите работу при помощи модуля code для отладки кода, вы должны удалить функцию code и оператор импорта так, чтобы ваша программа могла работать в обычном режиме. Модуль code предоставляет утилиту, так что как только вы все выполнили, необходимо ее убирать.

Вывод

Использование модуля code для запуска интерактивной консоли может позволить вам взглянуть на то, как работает код на детальном уровне, чтобы понять его поведение и вносить изменения по мере необходимости. Чтобы узнать больше об этом, вы можете прочитать официальную документацию модуля code.

 

Exit mobile version