Как сохранить интерактивный сеанс Python?

416

Я часто использую интерпретатор Python для работы с базами данных, файлами и т. Д. - в основном, много ручного форматирования полуструктурированных данных. Я неправильно сохраняю и очищаю полезные фрагменты так часто, как хотелось бы. Есть ли способ сохранить мой ввод в оболочку (соединения БД, назначения переменных, немного для циклов и биты логики) - какая-то история интерактивного сеанса? Если я использую что-то вроде этого, scriptя получаю слишком много шума. Мне не нужно травить все объекты - хотя, если есть решение, которое делает это, все будет в порядке. В идеале у меня остался бы сценарий, который запускался как созданный мной в интерактивном режиме, и я мог бы просто удалить ненужные фрагменты. Есть пакет, который делает это, или подход DIY?

ОБНОВЛЕНИЕ : я действительно поражен качеством и полезностью этих пакетов. Для тех с подобным зудом:

  • IPython - должен был использовать это целую вечность, вид того, что я имел в виду
  • реинтеграция - очень впечатляет, я хочу узнать больше о визуализации, и это, кажется, будет светить там. Что-то вроде настольного приложения gtk / gnome, которое отображает графики как встроенные. Представьте себе гибридную оболочку + графический калькулятор + мини-затмение. Источник распространения здесь: http://www.reinteract.org/trac/wiki/GettingIt . Отлично работает на Ubuntu, интегрируется в рабочий стол gnome, а также в установщики Windows и Mac.
  • bpython - очень круто, множество приятных функций, автозаполнение (!), перемотка назад, одно нажатие клавиши, сохранение в файл, отступы, отлично выполнено. Исходный дистрибутив Python, вытащил пару зависимостей из sourceforge.

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

неокантованный
источник

Ответы:

411

IPython чрезвычайно полезен, если вам нравится использовать интерактивные сессии. Например , для вашего потребительной случае есть команда магии , вы просто ввести для сохранения входных линий 10 до 20 и от 23 до (чтобы помочь с этим, каждая строка предваряется номером).%save%save my_useful_session 10-20 23my_useful_session.py

Кроме того, в документации говорится:

Эта функция использует тот же синтаксис, что и % history для входных диапазонов, затем сохраняет строки в указанное вами имя файла.

Это позволяет, например, ссылаться на старые сеансы, такие как

%save current_session ~0/
%save previous_session ~1/

Посмотрите видео на странице презентации, чтобы получить быстрый обзор функций.

Муравьи Аасма
источник
11
Как сохранить все строки? Без указания диапазона он создает пустой файл. :(
Балки
40
@balki, подсказка IPython говорит вам, сколько строк в вашей истории (т.е. In[48]). Так save filename 1-48спас бы всю вашу сессию.
Бен Пейдж
2
Кроме того, возможно ли загрузить этот файл обратно в ipython и сохранить вашу историю ввода без изменений?
Бен Пейдж
15
@BenPage Используйте «ipython -i [имя файла]» в сохраненном файле .py из приглашения bash, чтобы загрузить файл обратно, прежде чем вернуться к интерактивной консоли! (без флага -i вы не получите интерактивную консоль после запуска файла).
Самуэль Лампа
9
@ user4779, как и следовало ожидать:%load my_useful_session
Даниэль Серодио
167

http://www.andrewhjon.es/save-interactive-python-session-history

import readline
readline.write_history_file('/home/ahj/history')
Роберто Z
источник
10
Создает пустой файл для меня на Windows 7
ubershmekel
10
В Ubuntu у меня сработало очарование.
Johndt6
4
@ubershmekel - похоже, работает только на Unix
Джоэл Б
28
Не срабатывает мой TI-83
Дан
1
Не забудьте сделать это в конце вашего сеанса. Моя выглядела немного пустой после вызова функции только в начале.
dolphus333
95

Eсть способ сделать это. Сохраните файл в ~/.pystartup...

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=/home/user/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

а затем установите переменную среды PYTHONSTARTUP в вашей оболочке (например, в ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Вы также можете добавить это, чтобы получить автозаполнение бесплатно:

readline.parse_and_bind('tab: complete')

Обратите внимание, что это будет работать только на * nix системах. Как readline доступен только на платформе Unix.

Надя Алрамли
источник
Mac OS X использует строку редактирования, поэтому доступна полная функциональность табуляции, но точная команда отличается: readline.parse_and_bind ("bind ^ I rl_complete")
Miles
Это было безумно быстро, Надя, большое спасибо. Я попробую оба ответа - целевой платформой является Ubuntu, кстати
размонтирована
readline.parse_and_bind('tab: complete')работает, если вы используете MacPorts Python.
Филлип Облако
3
Это должно быть оформлено. Работал на RHEL 6.6. Pyenv, 2.7.10.
BilliAm
Почему я не искал это все эти годы! Это решение великолепно, так как использует оригинальный инструмент, быстрый и легкий.
иман
75

Если вы используете IPython, вы можете сохранить в файл все свои предыдущие команды, используя волшебную функцию % history с параметром -f , pe:

%history -f /tmp/history.py
nachouve
источник
Не был уверен в местонахождении файла, используя saveмагию. Это было очень полезно
alpha_989
4
Используйте %history -g -f full_history.pyдля получения истории всех сессий, а не только текущей. Смотрите также: документация для% history .
Евгений Сергеев
19

После установки Ipython и открытия сеанса Ipython с помощью команды:

ipython

в командной строке просто запустите следующую «магическую» команду Ipython для автоматической регистрации всего сеанса Ipython:

%logstart

Это создаст файл с уникальным именем .py и сохранит ваш сеанс для последующего использования в качестве интерактивного сеанса Ipython или для использования в выбранных вами сценариях.

webappzero
источник
14

Кроме того, реинтеграция дает вам подобный ноутбуку интерфейс к сеансу Python.

Нед Бэтчелдер
источник
4
reinteractтеперь заменен записной книжкой IPython и QtConsole.
Эрик О Лебиго
11

В дополнение к IPython, аналогичная утилита bpython имеет функцию «сохранить код, который вы ввели в файл»

DBR
источник
3
Кто-нибудь может объяснить, как это делается с bpython? Я попробовал ctrl + s, но это не сработало (версия 0.14.2 поверх Python 3.4.3 с терминалом Gnome)
Yibo Yang
По умолчанию он привязан к F7. F1 покажет вам помощь и текущие сочетания клавиш.
Джим К.
F7 запускает внешний редактор. Ctrl + s должен запросить простую функцию сохранения в файл, но он обязательно остановится в bash и zsh, поэтому вам нужно будет выбрать альтернативу в конфигурации bpython.
RCross
8

Мне пришлось изо всех сил, чтобы найти ответ, я был очень новым для среды iPython.

Это будет работать

Если ваша сессия iPython выглядит так

In [1] : import numpy as np
....
In [135]: counter=collections.Counter(mapusercluster[3])
In [136]: counter
Out[136]: Counter({2: 700, 0: 351, 1: 233})

Вы хотите сохранить строки от 1 до 135, затем в том же сеансе ipython используйте эту команду

In [137]: %save test.py 1-135

Это сохранит все ваши операторы python в файле test.py в вашем текущем каталоге (где вы инициировали ipython).

Somum
источник
3

Существует% истории магии для печати и сохранения истории ввода (и, возможно, вывода).

Чтобы сохранить текущий сеанс в файл с именем my_history.py:

>>> %hist -f my_history.py

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

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

Несколько других магических функций могут использовать вашу историю ввода, включая% edit,% rerun,% rev,% macro,% save и% pastebin. Вы можете использовать стандартный формат для ссылки на строки:

%pastebin 3 18-20 ~1/1-5

Это займет строку 3 и строки 18–20 текущего сеанса, а строки 1–5 предыдущего сеанса.

Смотрите% истории? для Docstring и другие примеры.

Кроме того, обязательно изучите возможности % store magic для облегченного хранения переменных в IPython.

Хранит переменные, псевдонимы и макросы в базе данных IPython.

d = {'a': 1, 'b': 2}
%store d  # stores the variable
del d

%store -r d  # Refresh the variable from IPython's database.
>>> d
{'a': 1, 'b': 2}

Чтобы автоматически c.StoreMagic.autorestore = Trueвосстановить сохраненные переменные при запуске, укажите в ipython_config.py.

Александр
источник
Включение сохранения истории вывода может быть сделано путем включения c.HistoryManager.db_log_outputв файле конфигурации.
Икке
3

Просто положить еще один совет в миску: Spyder

введите описание изображения здесь

Он имеет журнал истории и исследователь переменных . Если вы работали с MatLab, то вы увидите сходство.

Norfeldt
источник
2

Что касается Linux, можно использовать scriptкоманду для записи всего сеанса. Это часть util-linuxпакета, так должно быть в большинстве систем Linux. Вы можете создать и псевдоним или функцию, которая будет вызываться script -c pythonи которая будет сохранена в typescriptфайл. Например, вот перепечатка одного такого файла.

$ cat typescript                                                                                                      
Script started on Sat 14 May 2016 08:30:08 AM MDT
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello Pythonic World'
Hello Pythonic World
>>> 

Script done on Sat 14 May 2016 08:30:42 AM MDT

Небольшим недостатком здесь является то, что scriptзаписывает все, даже переводы строк, всякий раз, когда вы нажимаете клавишу Backspace и т. Д. Поэтому вы можете захотеть использовать их colдля очистки вывода (см. Этот пост в Unix & Linux Stackexchange ).

Сергей Колодяжный
источник
2

Команда %historyзамечательная, но, к сожалению, она не позволит вам сохранить вещи, которые были% paste 'd, в sesh. Чтобы сделать это, я думаю, что вы должны сделать %logstart в начале (хотя я не подтвердил эту работу).

Что мне нравится делать, так это

%history -o -n -p -f filename.txt

который сохранит вывод, номера строк и '>>>' перед каждым вводом (опции o, n и p). Смотрите документы для% истории здесь .

wordsforthewise
источник
1

есть еще один вариант --- pyslice. в "wxpython 2.8 docs demos and tools" есть программа с открытым исходным кодом "pyslices".

Вы можете использовать его как редактор, и он также поддерживает использование как консоль ---- выполнение каждой строки как интерактивный интерпретатор с немедленным эхо.

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

результаты записываются сразу за соответствующим блоком кода. очень удобно.

обзор ломтиков

fandyst
источник
Автор PySlices здесь. Рад, что вы любите PySlices (и что вы его даже нашли). Это еще не совсем заброшенная программа (я на самом деле все еще использую ее), но версия, включенная в сам wxPython, часто не работает должным образом. Если вы хотите следить за обновлениями, вы можете получить их из пакета wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David
1

Если вы используете bpython , вся история команд по умолчанию сохраняется в~/.pythonhist .

Чтобы сохранить команды для последующего повторного использования, вы можете скопировать их в файл скрипта Python:

$ cp ~/.pythonhist mycommands.py

Затем отредактируйте этот файл, чтобы очистить его и поместить в путь Python. (пакеты сайтов глобальной или виртуальной среды, текущий каталог, упоминание в * .pth или каким-либо другим способом).

Чтобы включить команды в вашу оболочку, просто импортируйте их из сохраненного файла:

>>> from mycommands import *
Аидас Бендорайтис
источник
спаситель жизни. трудно найти ответ
Мехди ЛАМРАНИ
0

В некоторых комментариях спрашивалось, как сохранить все входные данные IPython одновременно. Для% save magic в IPython вы можете сохранить все команды программно, как показано ниже, чтобы избежать появления сообщения с подсказкой, а также для указания вводимых номеров. currentLine = len (In) -1% save -f my_session 1- $ currentLine

Эта -fопция используется для принудительной замены файла и len(IN)-1отображает текущее приглашение ввода в IPython, позволяя вам сохранить весь сеанс программно.

Э. Ф. Агиш
источник
0

Для тех spacemacs, кто использует , и ipythonчто идет с этим python-layer, save magic создает много нежелательных выходных данных из-за постоянной команды автозаполнения, работающей в фоновом режиме, такой как:

len(all_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all_substa'''))
len(all_substantives_w_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all'''))
';'.join(__PYTHON_EL_get_completions('''all_'''))
';'.join(__PYTHON_EL_get_completions('''all_w'''))
';'.join(__PYTHON_EL_get_completions('''all_wo'''))
';'.join(__PYTHON_EL_get_completions('''all_wor'''))
';'.join(__PYTHON_EL_get_completions('''all_word'''))
';'.join(__PYTHON_EL_get_completions('''all_words'''))
len(all_words_w_logograms)
len(all_verbs)

Чтобы избежать этого, просто сохраните буфер ipython, как обычно, сохраните любой другой: spc f s

Каан Э.
источник
0

Я хотел бы предложить другой способ поддержки сессии Python через tmux на Linux. вы запускаете tmux, присоединяете себя к сеансу, который вы открыли (если он не был присоединен после его непосредственного открытия). выполнить Python и делать все, что вы делаете на нем. затем отсоединиться от сессии. отсоединение от сеанса tmux не закрывает сеанс. сессия остается открытой.

плюсы этого метода: вы можете присоединиться к этому сеансу с любого другого устройства (в случае, если вы можете SSH свой компьютер)

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

Myonaiz
источник
0

Чтобы сохранить ввод и вывод в XUbuntu :

  1. В XWindows запустите iPython из приложения терминала Xfce
  2. нажмите Terminalв верхней строке меню и найдите save contentsв раскрывающемся списке

Я считаю, что это сохраняет ввод и вывод, вплоть до того, когда я открыл терминал. Это не зависит от ipython и будет работать с ssh-сессиями или другими задачами, запускаемыми из окна терминала.

Павел
источник