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

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


person unmounted    schedule 03.06.2009    source источник


Ответы (20)


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/

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

person Ants Aasma    schedule 03.06.2009
comment
Как сохранить все строки? Без указания диапазона создается пустой файл. :( - person balki; 01.09.2011
comment
@balki, приглашение IPython сообщит вам, сколько строк в вашей истории (т.е. In[48]). Таким образом, save filename 1-48 сохранит всю вашу сессию. - person Ben Page; 22.09.2011
comment
Кроме того, можно ли загрузить этот файл обратно в ipython и сохранить историю ввода нетронутой? - person Ben Page; 22.09.2011
comment
хм, я получаю SyntaxError: неверный синтаксис, когда пробую его в приглашении Enthought pylab ... это должен быть IPython 12.1, и я не могу найти эту команду сохранения, задокументированную на сайте IPython ... - person Sam Joseph; 17.07.2012
comment
@SamJoseph: используйте% save my_useful_session 10-20 23 (как в примере сообщения), не забудьте знак процента - person feinmann; 23.08.2012
comment
feinmann - спасибо - вот и все - возможно, я смогу отредактировать ответ, чтобы сделать это очевидным ... но, видимо, не потому, что правки должны состоять как минимум из 6 символов ... - person Sam Joseph; 31.08.2012
comment
@BenPage Используйте ipython -i [имя_файла] для сохраненного файла .py из приглашения bash, чтобы загрузить файл обратно перед возвратом в интерактивную консоль! (без флага -i вы не получите интерактивную консоль после запуска файла). - person Samuel Lampa; 29.11.2012
comment
Где эта функция? Когда я пытаюсь из ipython, есть функция сохранения, но help (save) говорит, что сохранение не определено. Если я загружу ipython --pylab, то функция сохранения будет не такой, как у numpy. Я хочу вызвать ipython.save из ipython, но когда я использую pylab, если это возможно. - person mathtick; 09.01.2013
comment
@mathtick: есть разница между функциями Python и командами IPython (последние похожи на оболочку, встроенную в * nix), поэтому используется команда% save, которая является частью IPython. См. ipython.org /ipython-doc/rel-0.10.2/html/interactive/ - person RichVel; 04.05.2013
comment
Если вы хотите добавить в файл, а не перезаписать его, сохраните, используя параметр -a. Пример: %save -a my_useful_session 10-20 23 - person Ryan Endacott; 24.11.2014
comment
Так как же потом восстановить% сохранения? - person user4779; 18.12.2015
comment
@ user4779, как и следовало ожидать: %load my_useful_session - person Daniel Serodio; 05.01.2017
comment
Самый простой способ - это Linux Python2 - это ответ Роберто ниже. Все встроено и просто работает. import readline, затем readline.write_history_file('/home/ahj/history') - person SDsolar; 20.11.2017
comment
Проблема в том, что я пытаюсь использовать virtualenv, который не очень хорошо работает с jupyter - person Script Kitty; 25.08.2018
comment
@balki весь текущий сеанс можно указать с помощью ~0/ - person CharlesB; 30.11.2020

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

import readline
readline.write_history_file('/home/ahj/history')
person Roberto Z    schedule 15.03.2012
comment
Создает для меня пустой файл в Windows 7 - person ubershmekel; 14.05.2013
comment
Сработало для меня как шарм в Ubuntu. - person Johndt; 05.09.2014
comment
@ubershmekel - похоже, что работает только в Unix - person Joel B; 05.02.2015
comment
Не работает на моем TI-83 - person Dan; 13.01.2016
comment
Не забудьте сделать это в конце сеанса. Моя выглядела немного пустой после вызова функции только в начале. - person dolphus333; 28.04.2016
comment
работает на Python 2.7.2 (по умолчанию, 12 июня 2011 г., 15:08:59) [MSC v.1500 32 бит (Intel)] на win 32; Windows 7 - person Jellema; 08.03.2017
comment
пусто для меня на Ubuntu 16.04 Python 3.6 - person wordsforthewise; 19.04.2017
comment
Дает мне кучу странного дерьма на macOS - person Eric; 19.09.2017
comment
ИДЕАЛЬНО для Python2 на Ubuntu 16.04 LTS и на Raspberry Pi. Никакого специального соуса не требуется. Все встроено. Большое спасибо! - person SDsolar; 20.11.2017
comment
У меня работает на MacOS - person charles ross; 03.03.2018
comment
Работает на Ubuntu 16.04.3 Python 3.5.2, но сохраняет всю историю, а не только текущий сеанс - person Yushin Washio; 08.05.2018
comment
Ссылка теперь вроде не работает, только показывает connecting... белый экран - person lacostenycoder; 09.03.2019
comment
Очень полезно, когда под рукой есть только Python. - person tosh; 23.07.2019

Это можно сделать . Сохраните файл в _1 _...

# 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. Поскольку строка чтения доступна только на платформе Unix.

person Nadia Alramli    schedule 03.06.2009
comment
Mac OS X использует строку редактирования, поэтому доступна функция заполнения табуляции, но точная команда отличается: readline.parse_and_bind (bind ^ I rl_complete) - person Miles; 04.06.2009
comment
Это было безумно быстро, Надя, большое спасибо. Я попробую оба ответа - целевая платформа - Ubuntu, BTW - person unmounted; 04.06.2009
comment
readline.parse_and_bind('tab: complete') работает, если вы используете MacPorts Python. - person Phillip Cloud; 05.06.2012
comment
Это должно быть оформлено. Работал на RHEL 6.6. Pyenv, 2.7.10. - person BilliAm; 17.09.2015
comment
Почему я не искал это все эти годы! Это отличное решение, так как в нем используется оригинальный инструмент, быстрый и легкий. - person iman; 17.06.2017
comment
Просто я тоже хочу сказать, что я использую это вручную при отладке нестабильного кода, поскольку atexit не происходит, если интерпретатор выходит из строя. Еще раз спасибо за отличное предложение! - person taranaki; 09.11.2017

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

%history -f /tmp/history.py
person nachouve    schedule 30.04.2015
comment
Не был уверен в местонахождении файла, используя save магию. Это было очень полезно - person alpha_989; 02.02.2018
comment
Используйте %history -g -f full_history.py, чтобы получить историю всех сеансов, а не только текущего. См. Также: документацию по% history. - person Evgeni Sergeev; 28.03.2018

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

ipython

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

%logstart

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

person webappzero    schedule 30.10.2014

Кроме того, reinteract предоставляет интерфейс, похожий на блокнот. к сеансу Python.

person Ned Batchelder    schedule 04.06.2009
comment
reinteract теперь заменен IPython Notebook и QtConsole. - person Eric O Lebigot; 26.01.2014

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

person dbr    schedule 04.06.2009
comment
Кто-нибудь может объяснить, как это делается с помощью bpython? Я попробовал ctrl + s, но это не сработало (версия 0.14.2 поверх Python 3.4.3 с терминалом Gnome) - person Yibo Yang; 25.01.2016
comment
По умолчанию он привязан к F7. F1 покажет вам справку и текущие сочетания клавиш. - person Jim K.; 06.06.2017
comment
F7 запускает внешний редактор. Ctrl + s должен запросить простую функцию сохранения в файл, но она обязательно остановится в bash и zsh, поэтому вам нужно будет выбрать альтернативу в конфигурации bpython. - person RCross; 21.02.2020

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

person Somum    schedule 22.08.2014

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

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

>>> %hist -f my_history.py

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

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

Несколько других волшебных функций могут использовать вашу историю ввода, включая% edit,% rerun,% вспоминание,% macro,% save и% 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 = True в ipython_config.py.

person Alexander    schedule 06.02.2016
comment
Включение сохранения истории вывода можно сделать, включив c.HistoryManager.db_log_output в файле конфигурации. - person Ikke; 03.06.2016

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

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

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

person Norfeldt    schedule 06.05.2012

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

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

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

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

person wordsforthewise    schedule 19.04.2017

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

person Sergiy Kolodyazhnyy    schedule 14.05.2016

есть еще вариант --- пыслиц. в «wxpython 2.8 docs demos and tools» есть программа с открытым исходным кодом под названием «pyslices».

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

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

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

обзор pyslices

person fandyst    schedule 26.06.2013
comment
Автор PySlices здесь. Рад, что вам понравился PySlices (и что вы его даже нашли). Это еще не совсем утилита для отказа (на самом деле я все еще использую ее), но версия, включенная в сам wxPython, часто не работает. Если вы хотите следить за обновлениями, вы можете получать их из пакета wx_py: pypi.python.org/pypi/wx_py, github.com/davidmashburn/wx_py - person David; 23.09.2016

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

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

$ cp ~/.pythonhist mycommands.py

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

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

>>> from mycommands import *
person Aidas Bendoraitis    schedule 26.04.2017
comment
спаситель жизни. трудно найти ответ - person Mehdi LAMRANI; 11.12.2019

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

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

person E. F. Haghish    schedule 26.07.2016

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

person Kaan E.    schedule 23.12.2016

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

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

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

person Myonaiz    schedule 08.06.2017

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

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

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

person Paul    schedule 06.02.2019

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

In [2]: %hist

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

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
person user2314737    schedule 17.07.2020

Вы можете использовать встроенную функцию 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!

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

person user13518412    schedule 08.08.2020