Как сохранить интерактивную сессию Python?

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

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 3

Для этого существует способ. Сохраните файл в ~/.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.

Ответ 4

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

%history -f /tmp/history.py

Ответ 5

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

ipython

из командной строки, просто запустите следующую команду "магия" Ipython, чтобы автоматически регистрировать весь сеанс Ipython:

%logstart

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

Ответ 6

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

Ответ 7

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

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

Ответ 9

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

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

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

Ответ 10

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

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

>>> %hist -f my_history.py

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

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

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

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

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

См.% history? для Docstring и других примеров.

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

Сохраняет переменные, псевдонимы и макросы в базе данных IPythons.

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

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

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

Ответ 11

Что касается 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 записывает все, даже линейные каналы, всякий раз, когда вы нажимаете обратные пространства и т.д. Поэтому вы можете использовать col для очистки вывода (см. этот пост в Unix & Linux Stackexchange).

Ответ 12

есть еще один вариант --- pyslice. в "демонстрациях и инструментах wxpython 2.8 docs" есть программа с открытым исходным кодом под названием "pyslices".

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

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

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

the overview of pyslices

Ответ 13

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

Мне нравится делать

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

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

Ответ 14

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

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

Ответ 15

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

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

Ответ 16

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

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

$ cp ~/.pythonhist mycommands.py

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

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

>>> from mycommands import *

Ответ 17

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

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

минус этот метод: этот метод не отказывается от ресурсов, используемых открытым сеансом python, до тех пор, пока вы на самом деле не будете использовать интерпретатор python.

Ответ 18

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

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

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