Изменить интерактивную подсказку Python ">>>"

Это, наверное, глупый вопрос, и я, вероятно, в конечном итоге удалю его, как только выясню это, но, клянусь, я помню, как читать в документах Python 3.5, как изменить >>> в интерактивной подсказке Python, например, как вызов help() изменит его на help>. Но по какой-то причине, когда я вернулся, чтобы попытаться вспомнить, я просто не могу найти инструкции к нему. Кто-нибудь знает, возможно ли это, или я просто представляю вещи?

Спасибо

Ответы

Ответ 1

Ты правильно помнишь.

Он находится в модуле sys (sys.ps1 и sys.ps2):

Строки, указывающие первичное и вторичное приглашение интерпретатора. Они определяются только в том случае, если интерпретатор находится в интерактивном режиме. Их начальные значения в этом случае - " → > " и "...". Если для любой переменной присваивается нестроковый объект, его str() переоценивается каждый раз, когда интерпретатор готовится к чтению новой интерактивной команды; это можно использовать для реализации динамического приглашения.

Например:

   >>> import sys
   >>> sys.ps1 = "3.5>>> "
   3.5>>> sys.ps2 = "3.5... "
   3.5>>>

Ответ 2

Замечательно установить это либо:

  1. цвет для лучшего визуального аспекта
  2. пробел или пробел для упрощения операций копирования/вставки

Вставьте это в вашу оболочку bash:

tee ~/.pyrc <<EOF
#!/usr/bin/env python3
import sys
sys.ps1='\x1b[1;49;33m>>>\x1b[0m '  # bright yellow
sys.ps2='\x1b[1;49;31m...\x1b[0m '  # bright red
#sys.ps1='\x1b[33m>>>\x1b[0m '      # dark yellow
#sys.ps2='\x1b[31m...\x1b[0m '      # dark red

# For easy copy/paste of proper code, use a blank or space:
#sys.ps1=' '
#sys.ps2=' '
EOF

# Then do this:
chmod 755 ~/.pyrc

Наконец добавьте эту строку в ваш ~/.bash_profile:

export PYTHONSTARTUP=~/.pyrc

Наслаждайтесь!

enter image description here

Ответ 3

Если вы используете Windows (cmd.exe) и вам нужна цветная подсказка, вы можете использовать colorama, но есть некоторые предостережения. Если вы colorama.init в вашем PYTHONSTARTUP и назначите sys.ps1 строку, содержащую escape-коды окраски, это не сработает. Однако цветной вывод работает, когда вы вызываете print со строкой, содержащей красящие коды перехода.

К счастью, люди из Python, которые придумали sys.ps1 были достаточно щедры (или умны?), Чтобы позволить вам использовать любой объект в качестве ps1, а не только строки. Затем назначенный объект преобразуется в строку, используя метод __str__. Это означает, что вы можете определить свой собственный класс, например. Prompt и делайте все что угодно в его методе __str__, включая запись в stdout, завернутый в колораму (который будет работать!). Затем вы просто возвращаете пустую строку.

Этот факт приносит вам приятный бонус - вы также можете использовать непостоянную подсказку. Вы хотите дату в вашей оболочке Python, как в bash? Нет проблем.

import sys
import datetime
import colorama

colorama.init(autoreset=True)

class Prompt:
  def __str__(self):
    print(self.prompt, end='')
    return ''

class PS1(Prompt):

  @property
  def prompt(self):
    return '{brace_c}[{time_c}{time}{brace_c}]{prompt_c}>>> '.format(
              brace_c  = colorama.Fore.BLACK + colorama.Style.BRIGHT,
              # style is preserved, so the following are also bright:
              prompt_c = colorama.Fore.LIGHTYELLOW_EX,
              time_c   = colorama.Fore.BLACK,
              time     = datetime.datetime.now().strftime('%H:%M'),
            )

sys.ps1 = PS1()

Хотя это работает просто отлично, это довольно хакерский способ, поскольку предполагаемая цель метода __str__ - вернуть экземпляр str. Из-за этого он ломается, когда вы делаете то же самое с sys.ps2. Интерпретатор Python ожидает, что метод __str__ будет иметь побочных эффектов, и, по-видимому, оценивает как str(sys.ps1) и str(sys.ps2) при печати PS1, тогда как при печати PS2 уже оцененное (и сохраненное) значение str(sys.ps2) используется. В результате, если вы создадите класс PS2 аналогичный PS1 описанному выше, вы увидите PS1 и PS2, когда увидите только PS1, и ничего не увидите, когда увидите PS2. Другой случай, когда это не работает, - это когда несколько потоков/процессов пишут на консоль. Затем выходные данные из нескольких потоков чередуются, и хотя это может происходить и с обычным PS1, этот хак делает его еще хуже.

РЕДАКТИРОВАТЬ: Скриншот

screenshot

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