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

Как скопировать из сеанса IPython без подсказок терминала

Часто мой рабочий процесс включает в себя очистку данных /munging в оболочке IPython. Это стало особенно замечательным, так как IPython версии 5.0 со всеми замечательными обновляет интерфейс терминала. Итак, позвольте сказать, что я делаю попытку собрать некоторые неструктурированные данные:

In [11]: for i, (num, header, txt) in enumerate(data):
    ...:     header = [e.strip() for e in header.strip().split('\n')]
    ...:     header[4] = header[4].strip(',').split(',')
    ...:     data[i] = (num, header, txt)
    ...:

Фантастический, он работает! Но теперь я бы хотел добавить это в script в мой редактор. Если я скопирую и вставлю из своего терминала, я захвачу весь мусор слева. Я могу очистить это более или менее легко в редакторе, но было бы здорово, если бы я мог скопировать код непосредственно в буфер обмена с терминала, не касаясь мыши и не хватая лишних вещей. Есть ли такая функциональность в IPython?

4b9b3361

Ответ 1

Вы можете использовать магию %history для извлечения интересных частей из вашей сессии. Они будут показаны в терминале без какого-либо нежелательного сообщения.

Пример

In [1]: import numpy as np    
In [2]: a = np.random(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-83ce219ad17b> in <module>()
----> 1 a = np.random(10)

TypeError: 'module' object is not callable

In [3]: a = np.random.random(10)
In [4]: for i in a:
   ...:     print(i)
   ...:     
0.688626523886
[...]
0.341394850998

Если я хочу сохранить часть сеанса выше, я могу использовать:

In [5]: %history 1 3-4

import numpy as np
a = np.random.random(10)
for i in a:
    print(i)

В приведенном выше примере я использовал %history 1 3-4 для сборки всех команд, которые я хочу сохранить, и опустить те, которые мне не нужны (строка 2, одна с ошибкой). Теперь у вас есть версия вашей сессии, которая может быть красиво скопирована.

Запись файла

Вы также можете напрямую записать это в файл с помощью параметра -f FILENAME as.

In [8]: %history 1 3-4 -f /tmp/foo.py

Будьте осторожны, но это будет перезаписать существующие файлы. Более подробную информацию можно найти в документации магии %history.

Ответ 2

Итак, я наконец нашел отличное решение, которое по сути было именно тем, что я хотел: используйте Vi-режим в IPython. В версии 5 для этого требуется:

$ ipython --TerminalInteractiveShell.editing_mode=vi

Теперь я могу использовать удобный визуальный режим, подобный vi, и дергать все, что мне нужно!

Что приводит к следующему новому псевдониму в моем .bash_profile/.bash_rc:

alias vpython='ipython --TerminalInteractiveShell.editing_mode=vi'

Ответ 3

Команда save magic [ документация ] сохраняет нужные строки ввода в файл; опция -a предназначена для режима "добавления", так что строки добавляются в конец файла, а не перезаписывают файл. Я пользуюсь этим все время.

С вашим примером:

%save -a myfile.py 11
# the '%' is not necessary
save -a myfile.py 11

Тогда вы можете продолжить кодирование в IPython.

Когда есть другая команда, которую вы хотите записать в тот же файл, вы можете просто набрать save затем использовать стрелку вверх, чтобы вернуть последнее использование "save" (так, чтобы опция -a и имя файла уже были там) и просто измените номер строки.

Обратите внимание, что вы можете указать несколько строк для сохранения, а также диапазон строк:

save -a myfile.py 15 18 19-25

Ответ 4

В оболочке вы можете сначала преобразовать файл IPython в обычный файл Python (.py), а затем выполнить очистку:

http://ipython.org/ipython-doc/3/notebook/nbconvert.html (см. формат - to script)

Вы также можете загрузить файл в редакторе ноутбука в виде файла Python и выполнить очистку после этого шага.

Ответ 5

Я не думаю, что терминальные приложения действительно получают доступ к буферу copy/paste. Вам придется использовать мышь. Как это зависит от того, какой терминал вы используете. Большинство современных терминалов имеют своего рода режим "прямоугольный выбор" или "выбор блока".

В Windows прямоугольный выбор является значением по умолчанию для cmd.exe и Powershell. Если вы используете Cygwin mintty, держите Alt, а затем выберите область с помощью мыши. То же самое касается PuTTY.

В Linux (который у меня нет передо мной - возьмите их с солью), xterm не поддерживает его, Gnome Terminal использует Ctrl в качестве модификатора, а KDE Konsole использует Ctrl + Alt.

Для терминала OS X Интернет сообщает мне, что вы используете при нажатии.

Другие терминалы (и экран GNU), вероятно, имеют эту функцию, это просто вопрос, как ее активировать.