Jak zapisać sesję interaktywną Python?

416

Często używam interpretera Pythona do pracy z bazami danych, plikami itp. - w zasadzie dużo ręcznego formatowania częściowo ustrukturyzowanych danych. Nie zapisuję i nie czyszczę użytecznych fragmentów tak często, jak bym chciał. Czy istnieje sposób na zapisanie moich danych wejściowych w powłoce (połączenia db, przypisania zmiennych, trochę pętli i logiki) - trochę historii sesji interaktywnej? Jeśli użyję czegoś takiego script, dostanę zbyt duży hałas. Naprawdę nie muszę trawić wszystkich obiektów - chociaż jeśli istnieje rozwiązanie, które to robi, byłoby OK. Idealnie byłoby po prostu mieć skrypt, który działał jako ten, który stworzyłem interaktywnie, i mogłem po prostu usunąć niepotrzebne bity. Czy istnieje pakiet, który to robi, lub podejście DIY?

AKTUALIZACJA : Jestem naprawdę zaskoczony jakością i przydatnością tych pakietów. Dla osób z podobnym swędzeniem:

  • IPython - powinienem był używać tego od wieków, coś, co miałem na myśli
  • reinteract - bardzo imponujące, chcę dowiedzieć się więcej o wizualizacji i wygląda na to, że będzie tam świecić. Coś w rodzaju aplikacji komputerowej gtk / gnome, która renderuje wykresy w tekście. Wyobraź sobie hybrydową powłokę + kalkulator graficzny + mini zaćmienie. Dystrybucja źródła tutaj: http://www.reinteract.org/trac/wiki/GettingIt . Dobrze zbudowany na Ubuntu, integruje się również z instalatorami GNOME, Windows i Mac.
  • bpython - bardzo fajne, wiele fajnych funkcji, autouzupełnianie (!), przewijanie do tyłu, jedno naciśnięcie klawisza zapisu do pliku, wcięcie, dobra robota. Dystrybucja źródła w Pythonie, wyciągnęła kilka zależności z sourceforge.

Jestem nawrócony, to naprawdę zaspokaja potrzebę między tłumaczem a redaktorem.

nieoprawny
źródło

Odpowiedzi:

411

IPython jest niezwykle przydatny, jeśli lubisz korzystać z interaktywnych sesji. Na przykład dla przypadków użycia jest komenda magia , po prostu wejście zapisać wejściowych linii 10 do 20 i od 23 do (aby pomóc z tym, każda linia jest poprzedzona przez jego numer).%save%save my_useful_session 10-20 23my_useful_session.py

Ponadto dokumentacja stanowi:

Ta funkcja używa tej samej składni, co % history dla zakresów wejściowych, a następnie zapisuje linie pod podaną nazwą pliku.

Pozwala to na przykład na odwołanie do starszych sesji, takich jak

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

Obejrzyj filmy wideo na stronie prezentacji, aby uzyskać szybki przegląd funkcji.

Mrówka osocza
źródło
11
Jak zapisać wszystkie linie? Bez określenia zakresu tworzy pusty plik. :(
balki
40
@balki, monit IPython informuje o liczbie wierszy w twojej historii (tj In[48].). Więc save filename 1-48zapisałbym całą sesję.
Ben Page
2
Czy można załadować ten plik z powrotem do ipython i zachować nienaruszoną historię wprowadzania?
Ben Page
15
@BenPage Użyj „ipython -i [nazwa pliku]” na zapisanym pliku .py z promowania bash, aby ponownie załadować plik przed powrotem do interaktywnej konsoli! (bez flagi -i nie uruchomisz interaktywnej konsoli po uruchomieniu pliku).
Samuel Lampa
9
@ user4779, jak można się spodziewać:%load my_useful_session
Daniel Serodio
167

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

import readline
readline.write_history_file('/home/ahj/history')
Roberto Z
źródło
10
Tworzy dla mnie pusty plik w
systemie
10
W Ubuntu działało dla mnie jak urok.
Johndt6,
4
@ubershmekel - Wygląda na to, że działa tylko na Uniksie
Joel B
28
Nie działa na moim TI-83
Dan
1
Pamiętaj, aby to zrobić pod koniec sesji. Mój wyglądał trochę pusty po wywołaniu funkcji dopiero na początku.
dolphus333 27.04.16
95

Jest na to sposób . Zapisz plik w ~/.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

a następnie ustaw zmienną środowiskową PYTHONSTARTUPw swojej powłoce (np. in ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Możesz także dodać to, aby uzyskać autouzupełnianie za darmo:

readline.parse_and_bind('tab: complete')

Pamiętaj, że będzie to działać tylko w systemach * nix. Ponieważ readline jest dostępny tylko na platformie Unix.

Nadia Alramli
źródło
Mac OS X używa linii edycji, więc dostępna jest funkcja uzupełniania tabulatorami, ale dokładne polecenie jest inne: readline.parse_and_bind ("bind ^ I rl_complete")
Miles
To było szalone szybko, Nadia, wielkie dzięki. Spróbuję obu odpowiedzi - platformą docelową jest Ubuntu, BTW
odmontowano
readline.parse_and_bind('tab: complete')działa, jeśli używasz MacPorts Python.
Phillip Cloud,
3
To powinno być w ramce. Pracował na RHEL 6.6. Pyenv, 2.7.10.
BilliAm
Dlaczego nie szukałem tego przez te wszystkie lata! To rozwiązanie jest świetne, ponieważ wykorzystuje oryginalne narzędzie, które jest szybkie i lekkie.
iman
75

Jeśli używasz IPython , możesz zapisać do pliku wszystkie poprzednie polecenia, używając funkcji magicznej % history z parametrem -f , pe:

%history -f /tmp/history.py
nachouve
źródło
Nie byłem pewien lokalizacji pliku za pomocą savemagii. To było bardzo pomocne
alpha_989
4
Służy %history -g -f full_history.pydo pobierania historii ze wszystkich sesji, nie tylko bieżącej. Zobacz także: dokumentacja dla% history .
Evgeni Sergeev
19

Po zainstalowaniu Ipython i otwarciu sesji Ipython przez uruchomienie polecenia:

ipython

z poziomu wiersza poleceń wystarczy uruchomić następującą komendę Ipython „magia”, aby automatycznie zarejestrować całą sesję Ipython:

%logstart

Spowoduje to utworzenie unikatowego pliku .py i zapisanie sesji do późniejszego wykorzystania jako interaktywnej sesji Ipython lub do użycia w wybranym przez Ciebie skrypcie.

webappzero
źródło
14

Ponadto reinteract daje interfejs podobny do notebooka do sesji Pythona.

Ned Batchelder
źródło
4
reinteractjest teraz zastępowany przez notebook IPython i QtConsole.
Eric O Lebigot,
11

Oprócz IPython, podobne narzędzie bpython ma funkcję „zapisz kod, który wprowadziłeś do pliku”

dbr
źródło
3
czy ktoś może wyjaśnić, jak to się robi za pomocą bpython? Próbowałem ctrl + s, ale to nie działało (wersja 0.14.2 na Pythonie 3.4.3 z uruchomionym terminalem Gnome)
Yibo Yang
Domyślnie jest powiązany z F7. F1 pokaże ci pomoc i aktualne skróty klawiszowe.
Jim K.
F7 uruchamia zewnętrzny edytor. Ctrl + s powinien poprosić o prostą funkcję zapisu do pliku, ale musi „zatrzymać” się w bash i zsh, więc musisz wybrać alternatywę w konfiguracji bpython.
RCross
8

Musiałem walczyć o znalezienie odpowiedzi, byłem bardzo nowy w środowisku iPython.

To zadziała

Jeśli twoja sesja iPython wygląda tak

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

Chcesz zapisać linie od 1 do 135, a następnie w tej samej sesji ipython użyj tego polecenia

In [137]: %save test.py 1-135

Spowoduje to zapisanie wszystkich instrukcji Pythona w pliku test.py w bieżącym katalogu (gdzie zainicjowałeś ipython).

Somum
źródło
3

Istnieje% magii historii do drukowania i zapisywania historii danych wejściowych (i opcjonalnie danych wyjściowych).

Aby zapisać bieżącą sesję w pliku o nazwie my_history.py:

>>> %hist -f my_history.py

Historia IPython przechowuje zarówno wprowadzone przez ciebie polecenia, jak i uzyskane przez nie wyniki. Możesz łatwo przejść do poprzednich poleceń za pomocą klawiszy strzałek w górę i w dół lub uzyskać dostęp do swojej historii w bardziej wyrafinowany sposób.

Możesz użyć funkcji magicznej% history do zbadania przeszłych danych wejściowych i wyjściowych. Historia danych wejściowych z poprzednich sesji jest zapisywana w bazie danych, a IPython można skonfigurować do zapisywania historii danych wyjściowych.

Kilka innych magicznych funkcji może korzystać z historii wprowadzania, w tym% edit,% rerun,% recall,% macro,% save i% pastebin. Możesz użyć standardowego formatu w odniesieniu do wierszy:

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

Spowoduje to zabranie linii 3 i linii 18 do 20 z bieżącej sesji oraz linii 1-5 z poprzedniej sesji.

Zobacz historię%? dla Docstring i innych przykładów.

Pamiętaj również o zbadaniu możliwości % store magii w zakresie lekkiego przechowywania zmiennych w IPython.

Przechowuje zmienne, aliasy i makra w bazie danych 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}

Aby automatycznie zapisać przechowywane zmienne podczas uruchamiania, określ c.StoreMagic.autorestore = Truew ipython_config.py.

Alexander
źródło
Włączenie zapisywania historii danych wyjściowych można wykonać, włączając ją c.HistoryManager.db_log_outputw pliku konfiguracyjnym.
Ikke,
3

Wystarczy włożyć do miski kolejną sugestię: Spyder

wprowadź opis zdjęcia tutaj

Ma dziennik historii i eksploratora zmiennych . Jeśli pracowałeś z MatLab, zobaczysz podobieństwa.

Norfeldt
źródło
2

Jeśli chodzi o Linuksa, można użyć scriptpolecenia, aby nagrać całą sesję. Jest to część util-linuxpakietu, więc powinno być w większości systemów Linux. Możesz utworzyć alias lub funkcję, która zadzwoni script -c pythoni zostanie zapisana w typescriptpliku. Na przykład, oto przedruk jednego takiego pliku.

$ 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

Mała wada polega na tym, że scriptrejestruje wszystko, nawet linie, za każdym razem, gdy trafiasz do backspace, itp. Możesz więc użyć coldo wyczyszczenia danych wyjściowych (zobacz ten post na temat wymiany stosów w systemach Unix i Linux ).

Sergiy Kolodyazhnyy
źródło
2

%historyKomenda jest niesamowite, ale niestety to nie pozwoli Ci zaoszczędzić rzeczy, które były% pasta „d do Sesh. Aby to zrobić, myślę, że musisz to zrobić %logstart na początku (chociaż nie potwierdziłem, że to działa).

Lubię to

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

co zapisze dane wyjściowe, numery wierszy i „>>>” przed każdym wejściem (opcje o, n i p). Zobacz dokumentację dotyczącą% historii tutaj .

słowami
źródło
1

istnieje inna opcja --- pyslice. w „wxpython 2.8 docs demos and tools” dostępny jest program open source o nazwie „pyslices”.

możesz używać go jak edytora, a także obsługiwać jak konsolę - wykonywanie każdej linii jak interaktywny interpreter z natychmiastowym echem.

oczywiście wszystkie bloki kodów i wyniki każdego bloku zostaną automatycznie zapisane w pliku txt.

wyniki są rejestrowane tuż za odpowiednim blokiem kodu. bardzo wygodne.

przegląd pyslices

fandyst
źródło
Autor PySlices tutaj. Cieszę się, że lubisz PySlices (i że nawet go znalazłeś). Nie jest jeszcze całkiem porzucony (nadal go używam), ale wersja zawarta w samym wxPython często nie działa dobrze. Jeśli chcesz śledzić aktualizacje, możesz je pobrać z pakietu wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David
1

Jeśli używasz bpython , cała historia poleceń jest domyślnie zapisywana w ~/.pythonhist.

Aby zapisać polecenia do późniejszego ponownego użycia, możesz skopiować je do pliku skryptu python:

$ cp ~/.pythonhist mycommands.py

Następnie edytuj ten plik, aby go wyczyścić i umieść go pod ścieżką Pythona (pakiety witryn globalnego lub wirtualnego środowiska, bieżący katalog, wspominając w * .pth lub w inny sposób).

Aby dołączyć polecenia do powłoki, po prostu zaimportuj je z zapisanego pliku:

>>> from mycommands import *
Aidas Bendoraitis
źródło
wybawca życia. trudno znaleźć odpowiedź
Mehdi LAMRANI,
0

Niektóre komentarze pytały, jak zapisać wszystkie wejścia IPython jednocześnie. Dla% save magic w IPython, możesz zapisać wszystkie polecenia programowo, jak pokazano poniżej, aby uniknąć komunikatu zachęty, a także uniknąć podania liczb wejściowych. currentLine = len (In) -1% save -f my_session 1- $ currentLine

-fOpcja służy do wymuszania wymiany plików i len(IN)-1pokazuje prąd wejściowy szybki w ipython, co pozwala zapisać całą sesję programowo.

EF Haghish
źródło
0

Dla tych spacemacs, którzy używają , i ipythonto jest w python-layerkomplecie, zapisywanie magii tworzy wiele niechcianych danych wyjściowych, ze względu na stałe polecenie automatycznego uzupełniania działające w tle, takie jak:

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)

Aby tego uniknąć, po prostu zapisz bufor ipython, tak jak zwykle zapisujesz inne: spc f s

Kaan E.
źródło
0

Chciałbym zasugerować inny sposób na utrzymanie sesji Pythona przez Tmux na Linuksie. uruchamiasz tmux, dołączasz siebie do sesji, którą otworzyłeś (jeśli nie jest dołączony po otwarciu bezpośrednio). uruchom python i rób co na nim robisz. następnie odłącz się od sesji. odłączenie od sesji tmux nie zamyka sesji. sesja pozostaje otwarta.

zalety tej metody: możesz dołączyć do tej sesji z dowolnego innego urządzenia (na wypadek, gdybyś mógł ssh swojego komputera)

Wady tej metody: ta metoda nie rezygnuje z zasobów używanych przez otwartą sesję Pythona, dopóki faktycznie nie istnieje interpreter Pythona.

Myonaiz
źródło
0

Aby zapisać dane wejściowe i wyjściowe na XUbuntu :

  1. W XWindows uruchom iPython z aplikacji terminalowej Xfce
  2. kliknij Terminalgórny pasek menu i poszukaj save contentsw menu rozwijanym

Uważam, że zapisuje to dane wejściowe i wyjściowe, sięgając wstecz, kiedy otworzyłem terminal. Nie jest to specyficzne dla ipython i działałoby z sesjami ssh lub innymi zadaniami uruchamianymi z okna terminala.

Paweł
źródło