В bash я могу предотвратить сохранение команды в истории bash, поставив перед ней пробел. Я не могу использовать этот метод в ipython. Как сделать эквивалент в ipython?Как я могу избежать сохранения команды в истории ipython?
ответ
устаревание примечание: это было написано для IPython 4.0.1
. As of v5, IPython no longer uses readline
.
Отсутствует складской путь, может быть добавлен или обработан.
Есть два вида истории в IPython:
readline
история. Он доступен со специальными комбинациями клавиш/клавиш (вверх/вниз, Ctrl-R и т. Д.). Сохраняет только введенные строки (с<Enter>
) на консоли (или вpyreadline
, вставленные из буфера обмена). IPython полагается на локальную реализацию Pythonreadline
API, которая не имеет функции «не добавлять» и обычно добавляет каждую строку в историю.
IPython имеет возможность облегчить это,IPython.core.interactiveshell.ReadlineNoRecord
, менеджер контекста, который создает моментальный снимок истории, а затем восстанавливает его. Начиная сipython 4.0.1
, он используется только магией%run
, чтобы избежать добавления интерактивного ввода скрипта в историю.История IPython. Он сохраняется в БД и автоматических переменных. Он содержит полные входы (
readline
захватывает каждую<Enter>
«отдельную линию отдельно для многострочных) и выходы. Сохранение реализовано в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
с обертками, проверяющими флажки в соответствующих объектах и custom magic command, которые устанавливают/переключают их, должны делать трюк.
- readline: в публичном API нет соответствующей записи, поэтому она специфична для реализации. Например. для
автоматически удаляет
доказательстваввод/вывод из истории сразу после выполнения. Это можно сделать с помощью префиксной магии.- IPython:
HistoryManager
не имеет средств для удаления записей (ни от БД, ни от переменных). Увы, необходимо взломать БД вручную/заменить запасHistoryManager
. Также обратите внимание, что класс имеет дополнительный кешHistoryManager.db_cache_size
(по умолчанию отключен). - readline:
remove_history_item(index)
находится в API. Вам нужно знать количество строк на входе.
- IPython:
В качестве альтернативы, если вам требуется только это вводить пароли, рассмотреть другие способы, которые не повторяют пароль на экране (таким образом, не делает его частью истории консоли):
getpass.getpass()
- хранить его в другом месте (например, в файл конфигурации только для чтения вами)
1. _ «предотвратить добавление ввода в первую очередь. Этого нельзя сделать с помощью магии, предваряемой командой, только с той, которая запускается как отдельная команда и переключает флаг« _ что является примером отдельной команды переключить флаг, чтобы предотвратить добавление ввода? 2. _Декация run_cell и add_history с обертками, проверяющими флажки в соответствующих объектах, и пользовательская команда магии, которая устанавливает/переключает их, должна делать трюк. Вы можете добавить пример? – ShreevatsaR
@ShreevatsaR 0) см. Устаревание; 1) '% toggle',' your_command', '% toggle'; 2) это означает замену этих функций обертками вокруг них; пример выходит за рамки ответа, это должно быть понятно любому, кто имеет приличную экспертизу. –
Думаю, я наконец понял это. Этот метод не «предотвращает» ipython для записи истории, а фактически удаляет историю записи. Но я думаю, что это хороший способ достичь этой цели.
История ipython хранится в базе данных . файл в $(ipython locate)/profile_default/history.sqlite
.
Таблица базы данных История имеет четыре колонки: сессии, линии, источник и source_raw. В столбце представлен для текущего сеанса session_id
, его можно получить с помощью метода в ipython: get_ipython().history_manager.hisdb.get_last_session_id()
в ipython
. Колонка - это просто номер строки.
Так что я собираюсь сделать, это я собираюсь удалить эту запись в базе данных в ipython
среды:
1) Объект истории дб можно получить с помощью get_ipython().history_manager.db
в ipython
hismgr = get_ipython().history_manager
2) получить идентификатор сессии:
session_id = hismgr.get_last_session_id()
3) удалить Hist ORY линия с line_id
(предположим, что это 111 здесь) и session_id
hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(111, session_id))
4) Перечень In
и Out
массив также вид, как история, но она хранится в памяти, так что это может быть подметать или перезаписать как переменную ,
In[111]=Out[111]=''
Чтобы «предотвратить команду сохранения на IPython истории», означает удаление истории записи в строке в базе данных и и переписать В и Out массива в IPython среды. И мы могли бы объединить эти четыре строки в один, чтобы сделать работу один раз для всех. Вот пример, если мы хотим, чтобы удалить строку 128:
In [127]: history -l 3 -n
124: history -l 3 -n
125: hismgr = get_ipython().history_manager; session_id = hismgr.get_last_session_id();hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(123, session_id))
126: history -l 3 -n
In [128]: passwd='123456'
In [129]: hismgr = get_ipython().history_manager; session_id = hismgr.get_last_session_id();hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(128, session_id));In[128]=Out[128]='';
Out[129]: <sqlite3.Cursor at 0x7f8dce3dae30>
In [130]: history -l 3 -n
126: history -l 3 -n
127: history -l 3 -n
129: hismgr = get_ipython().history_manager; session_id = hismgr.get_last_session_id();hismgr.db.execute('DELETE FROM history WHERE line={0} and session={1}'.format(128, session_id));In[128]=Out[128]='';
История линия 128 ушла.
Вот некоторые документы, я пошел через
Это не значит «избегать хранения строки в истории», она скорее удаляет ее из истории пост фактум. –
@ivan_pozdeev Я знаю. Но я прочитал документ ipython и не могу найти какой-то способ «предотвратить команду, сохраненную в истории». Поэтому я выхожу, что если я удалю строку, она выполнит ту же работу. – realhu
- 1. ошибка в истории IPython?
- 2. Увеличение длины истории IPython
- 3. Как я могу избежать сохранения содержимого NSData в активной памяти?
- 4. Управление длиной истории ipython
- 5. Как избежать истории деятельности
- 6. ipython notebook изменить порядок истории заказа
- 7. Как я могу вставить вывод IPython в IPython?
- 8. Как настроить вывод команды истории?
- 9. PHP перенаправление без сохранения в истории
- 10. Как я могу предотвратить или избежать ввода интерактивных функций из сохранения в историю минибуфера?
- 11. Как я могу аннотировать изображение в IPython?
- 12. Выйти из команды ipython
- 13. истории PowerShell: как предотвратить повторяющиеся команды
- 14. Выполнение блока команд без сохранения его в истории оболочки (zsh)
- 15. Drupal: Могу ли я избежать перенаправления после создания/сохранения содержимого?
- 16. Как избежать 404 при использовании API истории истории в истории истории жизни. HTML5
- 17. Подозрительные команды в истории Shell
- 18. GIT различные истории команды
- 19. Команды из истории без номера команды
- 20. Как я могу возобновить переписывание истории git?
- 21. Как я могу избежать подзапроса?
- 22. iphone избежать состояния сохранения
- 23. Как я могу избежать мусора?
- 24. Как я могу избежать рекурсии?
- 25. Как сохранить ipython ноутбук без сохранения вывода?
- 26. Где находится файл истории для ipython
- 27. Jquery Адрес плагина: как избежать изменения истории?
- 28. ExtJS RedirectTo без сохранения URL в истории
- 29. Преобразование команды истории в сценарий оболочки
- 30. Как избежать логики сохранения в модели домена?
Rel ated: https://stackoverflow.com/questions/19606275/ipython-how-to-wipe-ipythons-history-selectively-securely – ShreevatsaR