Как сохранить интерактивный сеанс Python?
Я часто использую интерпретатор Python для работы с базами данных, файлами и т. д.-В основном много ручного форматирования полуструктурированных данных. Я не правильно сохраняю и очищаю полезные биты так часто, как хотелось бы. Есть ли способ сохранить мой вход в оболочку (соединения с БД, назначения переменных, немного для циклов и битов логики) - некоторая история интерактивного сеанса? Если я использую что-то вроде script Я получаю слишком много шума stdout. Мне действительно не нужно солить все объекты, хотя если есть решение, что это было бы нормально. В идеале я бы просто остался со скриптом, который работал как тот, который я создал в интерактивном режиме, и я мог бы просто удалить биты, которые мне не нужны. Есть ли пакет, который делает это, или подход DIY?
обновление: Я действительно поражен качеством и полезностью этих пакетов. Для тех, у кого похожий зуд:
- IPython -- должен был использовать это в течение многих лет, то, что я имел в виду
reinteract -- очень впечатляет, я хочу узнать больше о визуализации, и это кажется, что он будет светить там. Своего рода настольное приложение gtk / gnome, которое отображает графики в строке. Представьте себе гибридную оболочку + графический калькулятор + мини-затмение. Источник распространения здесь:http://www.reinteract.org/trac/wiki/GettingIt . Построенный отлично на Ubuntu, интегрируется в gnome desktop, Windows и Mac установщики тоже.
bpython -- очень круто, много приятных функций, автозаполнение(!), перемотка назад, одно нажатие клавиши сохранить в файл, отступ, хорошо сделано. Распределение исходным кодом на языке Python, вытащил пару зависимостей с SourceForge.
Я преобразован, они действительно заполняют потребность между интерпретатором и редактором.
17 ответов:
IPython очень полезно, если вам нравится использовать интерактивные сеансы. Например для вашего use-case есть the
%saveволшебная команда, вы просто введите%save my_useful_session 10-20 23для сохранения входных строк от 10 до 20 и от 23 доmy_useful_session.py(чтобы помочь с этим, каждая строка предваряется его количество).кроме того, в документации говорится:
эта функция использует тот же синтаксис, как %история для входных диапазонов, затем сохраняет строки в имя файла, которое вы указываете.
Это позволяет, например, ссылаться на старые сессии, такие как
%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, и открытие сеанса Ipython, выполнив команду:
ipythonиз командной строки просто запустите следующую команду Ipython 'magic', чтобы автоматически зарегистрировать весь сеанс Ipython:
%logstartэто создаст файл с уникальным именем. py и сохранит ваш сеанс для последующего использования в качестве интерактивного сеанса Ipython или для использования в сценариях по вашему выбору.
и reinteract дает вам ноутбук-подобный интерфейс для сеанса 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 magic для печати и сохранения входной истории (и, возможно, выход).
для сохранения текущего сеанса в файл с именем
my_history.py:>>> %hist -f my_history.pyистория IPython хранит как команды, которые вы вводите, так и результаты, которые он производит. Вы можете легко пройти через предыдущие команды с помощью клавиш со стрелками вверх и вниз, или получить доступ к истории более сложными способами.
вы можете использовать магическую функцию %history для изучения прошлого ввода и выход. История ввода из предыдущих сеансов сохраняется в базе данных, и IPython можно настроить для сохранения истории вывода.
ряд других магических функций может использовать историю ввода, %изменение, %повтор, %напомним, %макроэлементы, %сохранение и %сайт Pastebin. Вы можете использовать стандартный формат для ссылки на строки:
%pastebin 3 18-20 ~1/1-5это займет строку 3 и строки 18-20 из текущей сессии, а также строки 1-5 из предыдущей сессии.
посмотреть %истории? для строки документа и еще много примеров.
кроме того, не забудьте изучить возможности %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 = Truein ipython_config.py.
просто положить еще одно предложение в миску: Spyder
Это журнал и переменной проводник!--11-->. Если вы работали с MatLab, то вы увидите сходство.
насколько Linux идет, можно использовать
scriptкоманда для записи всего сеанса. Это частьutil-linuxпакет так должен быть на большинстве систем Linux . Вы можете создать и псевдоним или функцию, которая будет вызыватьscript -c pythonи это будет сохранено в . Например, вот перепечатка одного такого файла.$ 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записывает все, даже линейные каналы, когда вы нажимаете backspaces и т. д. Так что вы можете использоватьcolto очистите выход (см. этот пост на Unix & Linux Stackexchange).
есть еще один вариант --- pyslice. в " wxPython 2.8 Docs demos and tools "есть программа с открытым исходным кодом под названием"pyslices".
вы можете использовать его как редактор, а также поддерживать использование как консоль ---- выполнение каждой строки как интерактивный интерпретатор с немедленным эхом.
конечно, все блоки кодов и результаты каждого блока будут записаны в txt-файл автоматически.
результаты регистрируются сразу за соответствующий блок кода. очень удобно.
The
%historyкоманда потрясающая, но, к сожалению, она не позволит вам сохранить вещи, которые были %paste 'd в sesh. Для этого я думаю, что вы должны сделать%logstartв начале (хотя я не подтвердил, что это работает).то, что я люблю делать, это
%history -o -n -p -f filename.txtкоторый сохранит выход, номера строк и '>>>' перед каждым входом (параметры o, n и p). Смотрите также документацию к %История здесь.
некоторые комментарии спрашивали, как сохранить все входы IPython сразу. Для %save magic в IPython, вы можете сохранить все команды программно, как показано ниже, чтобы избежать сообщения приглашения, а также избежать указания входных чисел. currentLine = len (In)-1 %save-f my_session 1 - $currentLine
The
-fопция используется для принудительной замены файлов иlen(IN)-1показывает текущее приглашение ввода в IPython, что позволяет сохранить весь сеанс программно.
для тех, кто использует
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
Если вы используете bpython, вся ваша история команд по умолчанию сохраняется в
~/.pythonhist.чтобы сохранить команды для последующего повторного использования, вы можете скопировать их в файл скрипта python:
$ cp ~/.pythonhist mycommands.pyзатем изменить этот файл, чтобы очистить его и поместите его под путь Python (сайт глобальной или виртуальной среды-пакеты, текущий каталог, упоминание в *.pth, или каким-то другим способом).
чтобы включить команды в свою оболочку, просто импортируйте их из сохраненного файла:
>>> from mycommands import *
Я хотел бы предложить другой способ поддержания сеанса python через tmux на linux. вы запускаете tmux, прикрепляете себя к сеансу, который вы открыли (если не прикреплены после открытия его напрямую). выполните python и делайте все, что вы делаете на нем. затем отсоедините от сеанса. отсоединение от сеанса tmux не закрывает сеанс. сессия остается открытой.
плюсы этого метода: вы можете подключиться к этому сеансу с любого другого устройства (в случае, если вы можете ssh pc)
минусы этого метода: этот метод не освобождает ресурсы, используемые открытым сеансом python, пока вы фактически не создадите интерпретатор python.


Comments