Ответ 1
Замечание об устаревании: это было написано для IPython 4.0.1
. Начиная с v5, IPython больше не использует readline
.
Отсутствие запаса, может быть добавлено или обработано.
В IPython существует два типа истории:
-
readline
история. Он доступен со специальными комбинациями клавиш/клавиш (вверх/вниз, Ctrl-R и т.д.). Сохраняет только введенные строки (с<Enter>
) на консоли (или вpyreadline
, вставленные из буфера обмена). IPython полагается на локальную реализацию Pythonreadline
API, который не имеет функции "не добавлять" и обычно добавляет каждую строку к истории.
У IPython есть возможность облегчить это,IPython.core.interactiveshell.ReadlineNoRecord
, менеджер контекста, который создает моментальный снимок истории, а затем восстанавливает его. Начиная сIPython 4.0.1
, он используется только магией%run
, чтобы избежать добавления интерактивного ввода script в историю. -
История IPython. Он сохраняется в БД и автоматических переменных. Он содержит полные входы (
readline
захватывает каждую строку<Enter>
'ed отдельно для многострочных) и выходы. Сохранение реализовано вHistoryManager.store_inputs()
(для входов) иHistoryManager.store_output()
(для выходов), которое вызывается изInteractiveShell.run_cell
и определяется его аргументомstore_history
. Последнее, в свою очередь, называетсяTerminalInteractiveShell.interact
сstore_history=True
.
Существует два способа решения проблемы для любого уровня:
-
предотвратить добавление ввода в первую очередь. Это невозможно сделать с помощью магии, предваряемой командой, только с той, которая запускается как отдельная команда и переключает флаг. Это потому, что, как вы видели, текущий вход уже сохранен к тому времени, когда волшебная команда получает контроль.
- readline: в публичном API нет соответствующей записи, поэтому она специфична для реализации. Например. для
pyreadline
добавление выполняется с помощьюpyreadline.modes.basemode.BaseMode.add_history()
. Объект режима доступен какget_ipython().readline.rl.mode
. - Оформление
run_cell
иadd_history
с помощью флажков, проверяющих флажки в соответствующих объектах, и настраиваемая магическая команда, которая устанавливает/переключает их. трюк.
- readline: в публичном API нет соответствующей записи, поэтому она специфична для реализации. Например. для
-
автоматически удаляет
evidenceввод/вывод из истории сразу после выполнения. Это можно сделать с помощью префиксной магии.- IPython:
HistoryManager
не имеет средств для удаления записей (ни из базы данных, ни из переменных). Увы, необходимо взломать БД вручную/заменить запасHistoryManager
. Также обратите внимание, что класс имеет дополнительный кешHistoryManager.db_cache_size
(по умолчанию отключен). - readline:
remove_history_item(index)
находится в API. Вам нужно знать количество строк на входе.
- IPython:
В качестве альтернативы, если вам требуется только ввести пароль, рассмотрите другие способы, которые не повторяют пароль на экране (таким образом, не делая его частью истории консоли):
-
getpass.getpass()
- сохранить его в другом месте (например, файл конфигурации доступен для чтения только)