Я часто использую интерпретатор Python для работы с базами данных, файлами и т. Д. - в основном это ручное форматирование полуструктурированных данных. Я не сохраняю и не убираю полезные части так часто, как мне хотелось бы. Есть ли способ сохранить мой ввод в оболочку (соединения с базами данных, назначения переменных, немного циклов for и кусочки логики) - немного истории интерактивного сеанса? Если я использую что-то вроде script
, я получаю слишком много шума стандартного вывода. Мне действительно не нужно мариновать все объекты - хотя, если есть решение, которое делает это, все будет в порядке. В идеале я бы просто остался со сценарием, который запускался бы как тот, который я создал в интерактивном режиме, и я мог бы просто удалить биты, которые мне не нужны. Есть пакет, который делает это, или подход «сделай сам»?
Как сохранить интерактивный сеанс Python?
Ответы (20)
IPython чрезвычайно полезен, если вам нравится использовать интерактивные сеансы. Например, для вашего варианта использования существует волшебная команда %save
a>, вы просто вводите %save my_useful_session 10-20 23
, чтобы сохранить строки ввода с 10 по 20 и 23 в my_useful_session.py
(чтобы помочь с этим, каждая строка имеет префикс в виде номера).
Кроме того, в документации указано:
Эта функция использует тот же синтаксис, что и % history. для диапазонов ввода, затем сохраняет строки в указанном вами имени файла.
Это позволяет, например, ссылаться на более старые сеансы, такие как
%save current_session ~0/
%save previous_session ~1/
Просмотрите видеоролики на странице презентации, чтобы получить краткий обзор функций.
In[48]
). Таким образом, save filename 1-48
сохранит всю вашу сессию.
- person Ben Page; 22.09.2011
-a
. Пример: %save -a my_useful_session 10-20 23
- person Ryan Endacott; 24.11.2014
%load my_useful_session
- person Daniel Serodio; 05.01.2017
import readline
, затем readline.write_history_file('/home/ahj/history')
- person SDsolar; 20.11.2017
~0/
- person CharlesB; 30.11.2020
http://www.andrewhjon.es/save-interactive-python-session-history
import readline
readline.write_history_file('/home/ahj/history')
connecting...
белый экран
- person lacostenycoder; 09.03.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.
readline.parse_and_bind('tab: complete')
работает, если вы используете MacPorts Python.
- person Phillip Cloud; 05.06.2012
Если вы используете IPython, вы можете сохранить в файл все свои предыдущие команды, используя волшебную функцию %history с -f параметр, pe:
%history -f /tmp/history.py
save
магию. Это было очень полезно
- person alpha_989; 02.02.2018
%history -g -f full_history.py
, чтобы получить историю всех сеансов, а не только текущего. См. Также: документацию по% history.
- person Evgeni Sergeev; 28.03.2018
После установки Ipython и открытия сеанса Ipython с помощью команды:
ipython
из командной строки просто запустите следующую «волшебную» команду Ipython, чтобы автоматически регистрировать весь сеанс Ipython:
%logstart
Это создаст файл .py с уникальным именем и сохранит ваш сеанс для последующего использования в качестве интерактивного сеанса Ipython или для использования в сценариях по вашему выбору.
Кроме того, reinteract предоставляет интерфейс, похожий на блокнот. к сеансу Python.
reinteract
теперь заменен IPython Notebook и QtConsole.
- person Eric O Lebigot; 26.01.2014
В дополнение к 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 для печати и сохранения истории ввода (и, возможно, вывода).
Чтобы сохранить текущий сеанс в файле с именем 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.
c.HistoryManager.db_log_output
в файле конфигурации.
- person Ikke; 03.06.2016
Просто кладу еще одно предложение: Spyder
Он имеет журнал истории и обозреватель переменных. Если вы работали с MatLab, вы увидите сходство.
Команда %history
прекрасна, но, к сожалению, она не позволяет вам сохранять то, что было вставлено% paste, в sesh. Для этого, я думаю, вам нужно сделать %logstart
в начале (хотя я не подтверждал, что это работает).
Что мне нравится делать, так это
%history -o -n -p -f filename.txt
который сохранит вывод, номера строк и '>>>' перед каждым вводом (параметры o, n и p). См. Документацию по% history здесь.
Что касается 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).
есть еще вариант --- пыслиц. в «wxpython 2.8 docs demos and tools» есть программа с открытым исходным кодом под названием «pyslices».
вы можете использовать его как редактор, и он также поддерживает использование как консоль - выполнение каждой строки как интерактивный интерпретатор с немедленным эхом.
Конечно, все блоки кодов и результаты каждого блока будут автоматически записаны в текстовый файл.
результаты регистрируются сразу после соответствующего блока кода. очень удобно.
Если вы используете bpython, вся история ваших команд по умолчанию сохраняется в ~/.pythonhist
.
Чтобы сохранить команды для последующего повторного использования, вы можете скопировать их в файл сценария python:
$ cp ~/.pythonhist mycommands.py
Затем отредактируйте этот файл, чтобы очистить его, и поместите его по пути Python (пакеты сайтов глобального или виртуального окружения, текущий каталог, упоминание в * .pth или как-то иначе).
Чтобы включить команды в свою оболочку, просто импортируйте их из сохраненного файла:
>>> from mycommands import *
Некоторые комментарии спрашивали, как сохранить все входные данные IPython сразу. Для% save magic в IPython вы можете сохранить все команды программно, как показано ниже, чтобы избежать подсказки, а также не указывать входные числа. currentLine = len (In) -1% сохранить -f my_session 1- $ currentLine
Параметр -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
Я хотел бы предложить другой способ поддерживать сеанс python через tmux в Linux. вы запускаете tmux, присоединяетесь к сеансу, который вы открыли (если не присоединяетесь после открытия напрямую). выполнить python и делать с ним все, что вы делаете. затем отключитесь от сеанса. отсоединение от сеанса tmux не закрывает сеанс. сессия остается открытой.
плюсы этого метода: вы можете подключиться к этому сеансу с любого другого устройства (если вы можете использовать ssh свой компьютер)
минусы этого метода: этот метод не освобождает ресурсы, используемые открытым сеансом python, до тех пор, пока вы не создадите интерпретатор python.
Чтобы сохранить ввод и вывод в XUbuntu:
- В XWindows запустите iPython из терминального приложения Xfce.
- щелкните
Terminal
в верхней строке меню и найдитеsave contents
в раскрывающемся списке
Я считаю, что это сохраняет ввод и вывод, вплоть до того момента, когда я открыл терминал. Это не относится к ipython и будет работать с сеансами ssh или другими задачами, запускаемыми из окна терминала.
В 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
Вы можете использовать встроенную функцию 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!
Спасибо всем, кому понравились мои комментарии! Спасибо за чтение этого!