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

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

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

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

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

18 ответов

Решение

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/

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

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

import readline
readline.write_history_file('/home/ahj/history')

Есть способ сделать это. Сохраните файл в ~/.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.

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

%history -f /tmp/history.py

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

ipython

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

%logstart

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

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

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

Мне пришлось изо всех сил, чтобы найти ответ, я был очень новым для среды 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).

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

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

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

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

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

Чтобы сохранить текущий сеанс в файл с именем 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.

Просто положить еще один совет в чашу: Spyder

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

Что касается 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).

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

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

$ cp ~/.pythonhist mycommands.py

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

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

>>> from mycommands import *

В IPython я сначала использую

In [2]: %hist

чтобы просмотреть мой прошлый код. Я выбираю фрагмент, который хочу сохранить, а затем вставляю его в файлmy_file.py с использованием %%file магия (сокращение от %%writefile)

In [3]: %%file my_file.py
   ...: # paste code here 
   ...:  
   ...:  

ударяя return два раза в конце.

Чтобы добавить в файл, используйте опцию -a: %%file -a my_file.py.

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

In [5]: !ls -l my_file.py
In [6]: !vi my_file.py

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

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

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

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

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

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

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

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

Для тех, кто использует 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

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

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

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

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

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

Вы можете использовать встроенную функцию open: я использую ее во всех своих программах, в которых мне нужно хранить некоторую историю (включая калькулятор и т. Д.), Например:

#gk-test.py or anything else would do
try: # use the try loop only if you haven't created the history file outside program
    username = open("history.txt").readline().strip("\n")
    user_age = open("history.txt").readlines()[1].strip("\n")
except FileNotFoundError:
    username = input("Enter Username: ")
    user_age = input("Enter User's Age: ")
    open("history.txt", "w").write(f"{username}\n{user_age}")
#Rest of the code is secret! try it your own!

Спасибо всем, кому понравились мои комментарии! Спасибо за чтение этого!

Другие вопросы по тегам