Изменить интерактивную подсказку 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
Замечательно установить это либо:
- цвет для лучшего визуального аспекта
- пробел или пробел для упрощения операций копирования/вставки
Вставьте это в вашу оболочку 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]()
В этом простом примере это не так уж плохо (без чередования, только перепутанные цвета), но если вы выберете правильное время, это может быть хуже.