Подтвердить что ты не робот

Поиск в истории 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 может быть заменено регулярным выражением

4b9b3361

Ответ 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