Як зберегти інтерактивний сеанс Python?


416

Я часто зустрічаю інтерпретатора Python для роботи з базами даних, файлами тощо - в основному багато ручного форматування напівструктурованих даних. Я не зберігаю належним чином і не прибираю корисні шматочки так часто, як хотілося б. Чи є спосіб зберегти свій вклад в оболонку (db-з'єднання, змінні призначення, мало для циклів і бітів логіки) - деяка історія інтерактивного сеансу? Якщо я використовую щось подібне, scriptя отримую занадто великий шумний шум. Мені дійсно не потрібно маринувати всі об'єкти - хоча якщо є рішення, яке це робить, було б добре. В ідеалі мені просто залишиться сценарій, який працює як той, який я створив інтерактивно, і я міг просто видалити біти, які мені не потрібні. Чи є пакет, який це робить, або сам підхід?

ОНОВЛЕННЯ : Я дуже вражений якістю та корисністю цих пакунків. Для тих, хто має схожий свербіж:

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

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

Відповіді:


411

IPython надзвичайно корисний, якщо вам подобається використовувати інтерактивні сеанси. Наприклад , для вашого споживчої випадку є команда магії , ви просто ввести для збереження вхідних ліній 10 до 20 і від 23 до (щоб допомогти з цим, кожен рядок передує номером).%save%save my_useful_session 10-20 23my_useful_session.py

Крім того, у документації зазначено:

Ця функція використовує той самий синтаксис, що і історія% для діапазонів введення, а потім зберігає рядки до вказаного вами імені файла.

Це дозволяє, наприклад, посилатися на більш старі сеанси, такі як

%save current_session ~0/
%save previous_session ~1/

Перегляньте відео на сторінці презентації, щоб отримати швидкий огляд функцій.


11
Як зберегти всі рядки? Не вказуючи діапазон, він створює порожній файл. :(
balki

40
@balki, підказка IPython повідомляє вам, скільки рядків у вашій історії (тобто In[48]). Таким чином, ви save filename 1-48б зберегли весь ваш сеанс.
Бен Пейдж

2
Також, чи можна завантажити цей файл назад в ipython і зберегти історію введення недоторканою?
Бен Пейдж

15
@BenPage Використовуйте "ipython -i [ім'я файлу]" на збереженому файлі .py, починаючи з promt-файлу bash, щоб завантажити файл назад перед поверненням до інтерактивної консолі! (без прапора -i ви не отримаєте інтерактивну консоль після запуску файлу).
Самуель Лампа

9
@ user4779, як і слід було очікувати:%load my_useful_session
Даніель Серодіо

167

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

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

10
Створює порожній файл для мене на Windows 7
ubershmekel

10
Працював як шарм для мене в Ubuntu.
Johndt6

4
@ubershmekel - Схоже, це працює лише на Unix
Joel B

28
Виходить з ладу на моєму TI-83
Dan

1
Не забудьте зробити це в кінці сеансу. Моя виглядала трохи порожньою після виклику функції лише на старті.
dolphus333

95

Є спосіб це зробити. Зберегти файл у ~/.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 системах. Оскільки лінія читання доступна лише на платформі Unix.


Mac OS X використовує функцію редагування, тому доступна функція повного вкладки, але точна команда відрізняється: readline.parse_and_bind ("bind ^ I rl_complete")
Майлз

Це було шалено швидко, Надя, велике спасибі. Я спробую обидві відповіді - цільова платформа - Ubuntu, BTW
відключена

readline.parse_and_bind('tab: complete')працює, якщо ви використовуєте MacPorts Python.
Філіп Хмара

3
Це має бути обрамлено. Працював на RHEL 6.6. Пиєнв, 2.7.10.
BilliAm

Чому я не шукав цього всі ці роки! Це рішення чудово, оскільки використовує оригінальний інструмент, який швидко і легко.
iman

75

Якщо ви використовуєте IPython, ви можете зберегти у файл усі свої попередні команди, використовуючи магічну функцію % history з параметром -f , pe:

%history -f /tmp/history.py

Не впевнений у розташуванні файлу за допомогою saveмагії. Це було дуже корисно
alpha_989

4
Використовуйте %history -g -f full_history.pyдля отримання історії з усіх сеансів, а не тільки з поточних. Дивіться також: документація на% історію .
Євгеній Сергєєв

19

Після встановлення Ipython та відкриття сеансу Ipython за допомогою команди:

ipython

з вашого командного рядка просто запустіть таку команду Ipython 'magic', щоб автоматично записати весь сеанс Ipython:

%logstart

Це створить унікальний файл з назвою .py та збереже ваш сеанс для подальшого використання як інтерактивного сеансу Ipython або для використання у вибраному вами сценарії.



11

Крім IPython, аналогічна утиліта bpython має функцію "зберегти код, який ви ввели у файл"


3
хтось може пояснити, як це робиться з bpython? Я спробував ctrl + s, але це не спрацювало (версія 0.14.2 поверх Python 3.4.3 під керуванням терміналу Gnome)
Yibo Yang

За замовчуванням він прив’язаний до F7. F1 покаже вам допомогу та поточні вкладки.
Джим К.

F7 запускає зовнішній редактор. Ctrl + s повинен запропонувати просту функцію збереження у файлі, але вона обов'язково "зупиниться" в bash та zsh, тому вам потрібно вибрати альтернативу в конфігурації bpython.
RCross

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).


3

Існує% магія історії для друку та збереження вхідної історії (і необов'язково виводу).

Щоб зберегти поточний сеанс у файлі з назвою my_history.py:

>>> %hist -f my_history.py

Історія IPython зберігає як введені вами команди, так і результати, які вона створює. Ви можете легко пройти попередні команди за допомогою клавіш зі стрілками вгору та вниз або отримати доступ до своєї історії більш складними способами.

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

Кілька інших магічних функцій можуть використовувати вашу історію введення, включаючи% edit,% rerun,% call,% macro,% save та% pastebin. Ви можете використовувати стандартний формат для позначення рядків:

%pastebin 3 18-20 ~1/1-5

Це займе рядок 3 та рядки 18-20 з поточного сеансу та рядки 1-5 з попереднього сеансу.

Побачити% історію? для Docstring та інших прикладів.

Крім того, не забудьте вивчити можливості % зберігати магію для легкої стійкості змінних в 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.


Увімкнення збереження історії виводу може бути здійснено шляхом включення c.HistoryManager.db_log_outputу конфігураційний файл.
Ікке

3

Просто кладу в чашу ще одну пропозицію: Spyder

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

У ньому є журнал історії та провідник змінних . Якщо ви працювали з MatLab, то ви побачите схожість.


2

Що стосується 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 ).


2

%historyКоманда є дивним, але , до жаль , це не дозволить вам зберегти те , що було% пасти «D в Sesh. Для цього я думаю, що ти повинен зробити це %logstart на початку (хоча я ще не підтвердив це).

Що я люблю робити

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

що збереже вихід, рядки та ">>>" перед кожним входом (параметри o, n та p). Дивіться документи про історію% тут .


1

є ще один варіант --- pyslice. в демонстраційних програмах і інструментах "wxpython 2.8 docs" є програма з відкритим кодом під назвою "pyslices".

ви можете використовувати його як редактор, а також він підтримує використання як консолі ---- виконання кожного рядка, як інтерактивного інтерпретатора з негайним відлунням.

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

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

огляд песислів


Автор PySlices тут. Рада, що вам подобаються PySlices (і що ви їх навіть знайшли). Це ще не зовсім відмовитися від посуду (я фактично все ще використовую його), але версія, включена до самого wxPython, часто не працює добре. Якщо ви хочете слідкувати за оновленнями, ви можете отримати їх з пакету wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
Девід

1

Якщо ви використовуєте bpython , уся ваша історія команд за замовчуванням зберігається в ~/.pythonhist.

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

$ cp ~/.pythonhist mycommands.py

Потім відредагуйте цей файл, щоб очистити його та помістіть його під шлях Python (глобальні чи віртуальні середовища, сайти-пакети, поточна директорія, згадуючи * .pth чи іншим способом).

Щоб включити команди у свою оболонку, просто імпортуйте їх із збереженого файлу:

>>> from mycommands import *

рятувальник життя. важко знайти відповідь
Мехді ЛАМРАНІ

0

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

Цей -fпараметр використовується для примусової заміни файлів і len(IN)-1показує поточний запит на введення в IPython, що дозволяє зберегти весь сеанс програмно.


0

Для тих, хто використовує 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


0

Я хотів би запропонувати інший спосіб підтримати сеанс python через tmux на Linux. ви запустите tmux, приєднайте себе до сеансу, який ви відкрили (якщо не додається після відкриття безпосередньо). виконати пітон і робити все, що ти робиш на ньому. потім відірватися від сеансу. від'єднання від сеансу tmux не закриває сеанс. сесія залишається відкритою.

плюси цього методу: ви можете підключити до цього сеансу будь-який інший пристрій (на випадок, коли ви можете збити ПК)

Мінуси цього методу: цей метод не відмовляється від ресурсів, використовуваних відкритим сеансом python, поки ви фактично не існуєте інтерпретатора python.


0

Щоб зберегти вхід і вихід на XUbuntu :

  1. У XWindows запустіть iPython з терміналу програми Xfce
  2. клацніть Terminalу верхній панелі меню та шукайте save contentsу спадному меню

Я вважаю, що це економить вхід і вихід, ідучи повністю назад, коли я відкрив термінал. Це не специфічно для ipython, і він буде працювати з ssh-сеансами чи іншими завданнями, що виконуються з вікна терміналу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.