Поиск в истории ipython - PullRequest
25 голосов
/ 07 июля 2010
Команда

ipython * %his выводит последние команды, введенные пользователем.Можно ли искать в этих командах?Примерно так:

[c for c in %history if c.startswith('plot')]

EDIT Я не ищу способ перезапустить команду, но найти ее в списке истории.Конечно, иногда я захочу перезапустить команду после ее нахождения, либо дословно, либо с изменениями.

РЕДАКТИРОВАТЬ поиск с ctr-r, а затем ввод plot дает самую последнюю командуэто начинается с "заговора".В нем не будут перечислены все команды, которые начинаются с него.Вы также не можете искать в середине или конце команд

Решение

Расширение решения PreludeAndFugue здесь то, что я искал:

[l for l in  _ih if l.startswith('plot')]

здесь, if условие может быть заменено регулярным выражением

Ответы [ 7 ]

47 голосов
/ 31 мая 2013

Еще лучше: %hist -g pattern показывает вашу прошлую историю на pattern. Вы можете дополнительно ограничить свой поиск текущим сеансом или определенным диапазоном строк. Смотри %hist?

Так что для @ БорисГорелик вопрос, который вы должны сделать

%hist -g plot

К сожалению, вы не можете сделать

%hist -g ^plot

ни

%hist -g "^plot"
13 голосов
/ 07 июля 2010

Если вы хотите повторно запустить команду в своей истории, попробуйте Ctrl-r, а затем строку поиска.

10 голосов
/ 12 декабря 2013

Обычно мне хочется поискать всю историю 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 использует синтаксис поиска glob * sqlite.

7 голосов
/ 07 июля 2010

Как и в первом ответе, вы можете сделать следующее:

''.join(_ih).split('\n')

Однако при переборе элементов истории команд вы можете сделать следующее.Таким образом, вы можете создать свой список понимания из этого.

for item in _ih:
    print item

Это описано в следующем разделе документации: http://ipython.org/ipython-doc/dev/interactive/reference.html#input-caching-system

1 голос
/ 07 июля 2010

Есть способ, которым вы можете сделать это:

''.join(_ip.IP.shell.input_hist).split('\n')

или

''.join(_ip.IP.shell.input_hist_raw).split('\n')

, чтобы предотвратить расширение магии.

0 голосов
/ 01 ноября 2018
%history [-n] [-o] [-p] [-t] [-f FILENAME] [-g [PATTERN [PATTERN ...]]]
         [-l [LIMIT]] [-u]
         [range [range ...]]

....

-g <[PATTERN [PATTERN …]]>
treat the arg as a glob pattern to search for in (full) history. This includes the saved history (almost all commands ever written). The pattern may contain ‘?’ to match one unknown character and ‘*’ to match any number of unknown characters. Use ‘%hist -g’ to show full saved history (may be very long).

Пример (в моей истории):

In [23]: hist -g cliente*aza
655/58: cliente.test.alguna.update({"orden" : 1, "nuevo" : "azafran"})
655/59: cliente.test.alguna.update({"orden" : 1} , {$set : "nuevo" : "azafran"})
655/60: cliente.test.alguna.update({"orden" : 1} , {$set : {"nuevo" : "azafran"}})

Пример (в моей истории):

In [24]: hist -g ?lie*aza
655/58: cliente.test.alguna.update({"orden" : 1, "nuevo" : "azafran"})
655/59: cliente.test.alguna.update({"orden" : 1} , {$set : "nuevo" : "azafran"})
655/60: cliente.test.alguna.update({"orden" : 1} , {$set : {"nuevo" : "azafran"}})
0 голосов
/ 20 октября 2017
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
...