Как скопировать из сеанса 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?
Ответы
Ответ 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), вероятно, имеют эту функцию, это просто вопрос, как ее активировать.