Как сохранить интерактивную сессию 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/
Посмотрите видео на странице презентации, чтобы получить быстрый обзор функций.
Ответ 2
http://www.andrewhjon.es/save-interactive-python-session-history
import readline
readline.write_history_file('/home/ahj/history')
Ответ 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:
- В XWindows запустите iPython из приложения терминала Xfce
- нажмите
Terminal
в верхней строке меню и найдите в выпадающем списке save contents
для save contents
Я считаю, что это сохраняет ввод и вывод, вплоть до того, когда я открыл терминал. Это не зависит от ipython и будет работать с ssh-сессиями или другими задачами, запускаемыми из окна терминала.