Поиск в истории ipython
ipython %his
команда выводит последние команды, введенные пользователем. Можно ли выполнять поиск в этих командах? Что-то вроде этого:
[c for c in %history if c.startswith('plot')]
EDIT Я не ищу способ повторного запуска команды, но чтобы найти ее в списке истории. Конечно, иногда мне захочется повторить команду после ее нахождения, дословно или с изменениями.
ИЗМЕНИТЬ поиск с помощью ctr-r
, а затем введите plot
, чтобы получить самую последнюю команду, начинающуюся с "plot". Он не будет перечислять все команды, которые начинаются с него. Вы также можете выполнять поиск в середине или в конце команд
Решение
Расширение решения PreludeAndFugue здесь, что я искал:
[l for l in _ih if l.startswith('plot')]
здесь условие if
может быть заменено регулярным выражением
Ответы
Ответ 1
Как и в первом ответе, вы можете сделать следующее:
''.join(_ih).split('\n')
Однако при повторном выполнении элементов истории команд вы можете сделать следующее. Таким образом, вы можете создать понимание этого списка.
for item in _ih:
print item
Это описано в следующем разделе документации:
http://ipython.org/ipython-doc/dev/interactive/reference.html#input-caching-system
Ответ 2
Еще лучше: %hist -g |pattern|
greped ваша прошлая история для |pattern|
. Вы можете дополнительно ограничить свой поиск текущим сеансом или определенным диапазоном строк. См. %hist?
Итак, для вопроса @BorisGorelik вам нужно будет сделать
%hist -g plot
К сожалению, вы не можете сделать
%hist -g ^plot
или
%hist -g "^plot"
Ответ 3
Если вы хотите повторно запустить команду в своей истории, попробуйте Ctrl-r
, а затем строку поиска.
Ответ 4
Обычно я нахожусь в поиске всей истории ipython во всех предыдущих и текущих сеансах. Для этого я использую:
from IPython.core.history import HistoryAccessor
hista = HistoryAccessor()
z1 = hista.search('*numpy*corr*')
z1.fetchall()
ИЛИ (не запускайте оба или вы будете повреждать/стирать свою историю)
ip = get_ipython()
sqlite_cursor = ip.history_manager.search('*numpy*corr*')
sqlite_cursor.fetchall()
Строка поиска не является регулярным выражением. В iPython history_manager вместо этого используется синтаксис sqlite glob *
.
Ответ 5
Есть способ, которым вы можете это сделать:
''.join(_ip.IP.shell.input_hist).split('\n')
или
''.join(_ip.IP.shell.input_hist_raw).split('\n')
чтобы предотвратить расширение магии.
Ответ 6
from IPython.core.history import HistoryAccessor
def search_hist(pattern,
print_matches=True,
return_matches=True,
wildcard=True):
if wildcard:
pattern = '*' + pattern + '*'
matches = HistoryAccessor().search(pattern).fetchall()
if not print_matches:
return matches
for i in matches:
print('#' * 60)
print(i[-1])
if return_matches:
return matches