Как сохранить интерактивный сеанс 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 и открытия сеанса 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:
- В XWindows запустите iPython из приложения терминала Xfce
- щелчок
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!
Спасибо всем, кому понравились мои комментарии! Спасибо за чтение этого!