# Файл запуска python
```python=
import atexit
import os
try:
import readline
except ImportError:
print("Завершение недоступно: модуль readline недоступен")
else:
import rlcompleter
# Автозаполнение
readline.parse_and_bind('tab: complete')
# Путь к файлу истории в домашнем каталоге пользователя
# Можно использовать собственный путь
history_file = os.path.join(os.environ['HOME'], '.python_shell_history')
try:
readline.read_history_file(history_file)
except IOError:
pass
atexit.register(readline.write_history_file, history_file)
del os, history_file, readline, rlcompleter
```
Создайте этот файл в вашем домашнем каталоге и назовите его **.pythonstartup**.
Затем добавьте переменную **PYTHONSTARTUP** в вашу среду, используя путь к этому файлу.
## Настройка переменной среды PYTHONSTARTUP
Если вы работаете под Linux или macOS, то самый простой способ — создать
скрипт запуска в домашней папке. Затем нужно связать его с переменной среды
PYTHONSTARTUP, которая задается в скрипте запуска оболочки. Например, в обо-
лочках Bash и Korn используется файл .profile, в который вы можете вставить
такую строку:
```bash=
export PYTHONSTARTUP=~/.pythonstartup
```
Если вы работаете под Windows, то легко установить новую переменную среды с правами администратора в настройках системы, а затем сохранить скрипт в общем месте, а не задействовать заданное пользователем местоположение.
Писать скрипт для PYTHONSTARTUP — хорошее упражнение, но создавать хорошие пользовательские оболочки в одиночку бывает сложно и немногие разработчики находят на это время. К счастью, существует несколько реализаций пользовательской оболочки Python, которые позволяют чрезвычайно упростить
интерактивные сессии в Python.
### ptpython
Оболочка ptpython (github.com/jonathanslenders/ptpython/) — иной подход к совре-
менным оболочкам Python. Интересно в данном проекте то, что реализация основ-
ных функций доступна в виде отдельного пакета, называемого prompt_toolkit
(от того же автора). Это позволяет легко создавать различные эстетически при-
ятные интерактивные интерфейсы командной строки.
Эту оболочку часто по функциональности сравнивают с bpython, но основ-
ное отличие состоит в том, что она позволяет работать в режиме совместимости
с IPython и в ее синтаксисе есть дополнительные функции, такие как %pdb, %cpaste
и %profile.
## Включение оболочек в собственные скрипты и программы
Иногда возникает необходимость встроить цикл read-eval-print (REPL), похожий
на интерактивную сессию Python, в ваше ПО. Это облегчает экспериментирование
с кодом и его проверку «изнутри». Самый простой модуль, который позволяет эму-
лировать интерактивный интерпретатор Python, входит в стандартную библиотеку
и называется **code**.
Скрипт, который запускает интерактивную сессию, состоит из одного импорта
и вызова функции:
```python=
import code
code.interact()
```
Ниже приведены примеры того, как можно сослаться на все ранее упомянутые
оболочки внутри вашего кода:
```python=
# Пример для IPython
import IPython
IPython.embed()
```
```python=
# Пример для bpython
import bpython
bpython.embed()
```
```python=
# Пример для ptpython
from ptpython.repl import embed
embed(globals(), locals())
```
### Интерактивные отладчики
Отладка кода — неотъемлемая часть процесса разработки ПО. Многие программисты проводят большую часть своей жизни, используя только логи и операторы `print` в качестве основного средства отладки, но большинство профессиональных
разработчиков предпочитают задействовать какой-нибудь отладчик.
Python поставляется с уже встроенным интерактивным отладчиком под названием pdb (см. docs.python.org/3/library/pdb.html). Его можно вызвать из командной строки в скрипте, чтобы Python запустил постмортем-отладку, если программа завершается аварийно:
```bash=
python -m pdb script.py
```
Постмортем-отладка хоть и полезна, но не универсальна. Она полезна, только когда приложение завершается с исключением, если происходит ошибка. Часто некорректный код просто ведет себя неправильно, но не завершается ошибкой.
В таких случаях можно установить пользовательские точки останова (брейкпойнты) в конкретных строках кода с помощью вот такой строки:
```python=
import pdb; pdb.set_trace()
```
Сессия отладки в **pdb** выглядит очень просто и не дает дополнительных функций, таких как автозаполнение или подсветка кода. К счастью, в PyPI есть несколько пакетов, которые предоставляют такие функции из альтернативных оболочек Python, уже упоминавшихся выше. Наиболее известные примеры:
ipdb — это отдельный пакет на основе ipython;
ptpdb — отдельный пакет на основе ptpython;
bpdb — идет в комплекте с bpython.