Bagaimana cara menyimpan sesi interaktif Python?

416

Saya sering menemukan diri saya menggunakan juru bahasa Python untuk bekerja dengan database, file, dll - pada dasarnya banyak format manual dari data semi-terstruktur. Saya tidak menyimpan dan membersihkan bit berguna sesering yang saya inginkan. Apakah ada cara untuk menyimpan input saya ke dalam shell (koneksi db, tugas variabel, sedikit untuk loop dan bit logika) - beberapa sejarah sesi interaktif? Jika saya menggunakan sesuatu seperti scriptsaya terlalu banyak kebisingan stdout. Saya tidak perlu acar semua objek - meskipun jika ada solusi yang melakukan itu, tidak apa-apa. Idealnya saya hanya akan dibiarkan dengan skrip yang berjalan seperti yang saya buat secara interaktif, dan saya hanya bisa menghapus bit yang tidak saya butuhkan. Apakah ada paket yang melakukan ini, atau pendekatan DIY?

PEMBARUAN : Saya sangat kagum dengan kualitas dan kegunaan paket-paket ini. Bagi mereka yang memiliki gatal serupa:

  • IPython - seharusnya sudah menggunakan ini sejak lama, semacam apa yang ada dalam pikiran saya
  • berinteraksi kembali - sangat mengesankan, saya ingin belajar lebih banyak tentang visualisasi dan ini sepertinya akan bersinar di sana. Semacam aplikasi desktop gtk / gnome yang membuat grafik sebaris. Bayangkan shell hybrid + kalkulator grafik + gerhana mini. Distribusi sumber di sini: http://www.reinteract.org/trac/wiki/GettingIt . Dibangun dengan baik di Ubuntu, terintegrasi ke desktop gnome, Windows dan Mac juga.
  • bpython - sangat keren, banyak fitur bagus, autocomplete (!), rewind, satu keystroke save to file, indentation, well done. Distribusi sumber Python, menarik beberapa dependensi dari sourceforge.

Saya sudah bertobat, ini benar-benar memenuhi kebutuhan antara juru bahasa dan editor.

lepas
sumber

Jawaban:

411

IPython sangat berguna jika Anda suka menggunakan sesi interaktif. Misalnya untuk kasus penggunaan Anda ada yang %saveperintah sihir , Anda hanya masukan %save my_useful_session 10-20 23untuk menyimpan jalur input 10 sampai 20 dan 23 untuk my_useful_session.py(untuk bantuan dengan ini, setiap baris diawali dengan nomor nya).

Lebih lanjut, dokumentasi menyatakan:

Fungsi ini menggunakan sintaksis yang sama dengan % history untuk rentang input, kemudian menyimpan baris ke nama file yang Anda tentukan.

Ini memungkinkan misalnya, untuk referensi sesi yang lebih lama, seperti

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

Lihat video di halaman presentasi untuk mendapatkan gambaran umum singkat fitur.

Semut Aasma
sumber
11
Bagaimana cara menyimpan semua baris? Tanpa menentukan rentang, itu membuat file kosong. :(
balki
40
@ Balki, prompt IPython memberi tahu Anda berapa banyak baris dalam riwayat Anda (yaitu In[48]). Jadi save filename 1-48akan menghemat seluruh sesi Anda.
Ben Page
2
Juga, mungkinkah memuat file ini kembali ke ipython dan menjaga riwayat input Anda tetap utuh?
Ben Page
15
@BenPage Gunakan "ipython -i [nama file]" pada file .py yang disimpan, dari bash promt untuk memuat file kembali sebelum kembali ke konsol interaktif! (tanpa flag -i, Anda tidak mendapatkan konsol interaktif setelah menjalankan file).
Samuel Lampa
9
@ user4779, seperti yang diharapkan:%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
sumber
10
Membuat file kosong untuk saya di windows 7
ubershmekel
10
Bekerja seperti pesona bagi saya di Ubuntu.
Johndt6
4
@ubershmekel - Sepertinya hanya berfungsi di Unix
Joel B
28
Gagal pada TI-83 saya
Dan
1
Ingatlah untuk melakukannya di akhir sesi Anda. Milik saya tampak agak kosong setelah memanggil fungsi hanya di awal.
dolphus333
95

Ada cara untuk melakukannya. Simpan file di ~/.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

dan kemudian atur variabel lingkungan PYTHONSTARTUPdi shell Anda (mis. di ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Anda juga dapat menambahkan ini untuk mendapatkan pelengkapan otomatis secara gratis:

readline.parse_and_bind('tab: complete')

Harap dicatat bahwa ini hanya akan bekerja pada sistem * nix. Karena readline hanya tersedia di platform Unix.

Nadia Alramli
sumber
Mac OS X menggunakan editline, jadi ada fungsi tab-complete yang tersedia, tetapi perintah yang tepat berbeda: readline.parse_and_bind ("bind ^ I rl_complete")
Miles
Itu gila cepat, Nadia, terima kasih banyak. Saya akan mencoba kedua jawaban - platform target adalah Ubuntu, BTW
unmount
readline.parse_and_bind('tab: complete')berfungsi jika Anda menggunakan MacPorts Python.
Phillip Cloud
3
Ini harus dibingkai. Bekerja pada RHEL 6.6. Pyenv, 2.7.10.
BilliAm
Mengapa saya tidak mencari ini selama bertahun-tahun! Solusi ini sangat bagus karena menggunakan alat asli yang cepat dan ringan.
iman
75

Jika Anda menggunakan IPython, Anda dapat menyimpan ke file semua perintah Anda sebelumnya menggunakan fungsi sulap % sejarah dengan parameter -f , pe:

%history -f /tmp/history.py
nachouve
sumber
Tidak yakin tentang lokasi file menggunakan savesihir. Ini sangat membantu
alpha_989
4
Gunakan %history -g -f full_history.pyuntuk mendapatkan riwayat dari semua sesi, bukan hanya yang saat ini. Lihat juga: dokumentasi untuk% histori .
Evgeni Sergeev
19

Setelah menginstal Ipython , dan membuka sesi Ipython dengan menjalankan perintah:

ipython

dari baris perintah Anda, jalankan saja perintah 'sihir' Ipython berikut untuk secara otomatis mencatat seluruh sesi Ipython Anda:

%logstart

Ini akan membuat file .py bernama unik dan menyimpan sesi Anda untuk digunakan nanti sebagai sesi Ipython interaktif atau untuk digunakan dalam skrip yang Anda pilih.

webappzero
sumber
14

Juga, reinteract memberi Anda antarmuka seperti notebook ke sesi Python.

Ned Batchelder
sumber
4
reinteractsekarang digantikan oleh Notebook IPython dan QtConsole.
Eric O Lebigot
11

Selain IPython, bpython utilitas serupa memiliki fitur "simpan kode yang Anda masukkan ke file"

dbr
sumber
3
adakah yang bisa menjelaskan bagaimana ini dilakukan dengan bpython? Saya mencoba ctrl + s tetapi tidak berhasil (versi 0.14.2 di atas Python 3.4.3 menjalankan terminal Gnome)
Yibo Yang
Ini terikat ke F7 secara default. F1 akan menunjukkan kepada Anda bantuan dan ikatan kunci saat ini.
Jim K.
F7 meluncurkan editor eksternal. Ctrl + s akan meminta fitur save to file yang sederhana, tetapi harus "berhenti" di bash dan zsh, jadi Anda harus memilih alternatif di konfigurasi bpython.
RCross
8

Saya harus berjuang untuk menemukan jawaban, saya sangat baru di lingkungan iPython.

Ini akan bekerja

Jika sesi iPython Anda terlihat seperti ini

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

Anda ingin menyimpan baris dari 1 hingga 135 kemudian pada sesi ipython yang sama gunakan perintah ini

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

Ini akan menyimpan semua pernyataan python Anda dalam file test.py di direktori Anda saat ini (tempat Anda memulai ipython).

Somum
sumber
3

Ada% history magic untuk mencetak dan menyimpan histori input (dan opsional output).

Untuk menyimpan sesi Anda saat ini ke file bernama my_history.py:

>>> %hist -f my_history.py

History IPython menyimpan perintah yang Anda masukkan, dan hasil yang dihasilkannya. Anda dapat dengan mudah melalui perintah sebelumnya dengan tombol panah atas dan bawah, atau mengakses riwayat Anda dengan cara yang lebih canggih.

Anda dapat menggunakan fungsi% history magic untuk memeriksa input dan output sebelumnya. Input history dari sesi sebelumnya disimpan dalam database, dan IPython dapat dikonfigurasi untuk menyimpan histori output.

Beberapa fungsi ajaib lainnya dapat menggunakan riwayat input Anda, termasuk% edit,% jalankan kembali,% recall,% makro,% save dan% pastebin. Anda dapat menggunakan format standar untuk merujuk ke baris:

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

Ini akan mengambil baris 3 dan baris 18 hingga 20 dari sesi saat ini, dan baris 1-5 dari sesi sebelumnya.

Lihat% riwayat? untuk Docstring dan lebih banyak contoh.

Juga, pastikan untuk menjelajahi kemampuan % store magic untuk persistensi variabel yang ringan di IPython.

Menyimpan variabel, alias, dan makro dalam basis data 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}

Untuk mengotomatiskan variabel yang disimpan saat startup, tentukan c.StoreMagic.autorestore = Truedi ipython_config.py.

Alexander
sumber
Mengaktifkan riwayat penyimpanan simpanan dapat dilakukan dengan mengaktifkan c.HistoryManager.db_log_outputdi file konfigurasi.
Ikke
3

Hanya menempatkan saran lain di mangkuk: Spyder

masukkan deskripsi gambar di sini

Ini memiliki log Riwayat dan penjelajah Variabel . Jika Anda telah bekerja dengan MatLab, maka Anda akan melihat kesamaannya.

Norfeldt
sumber
2

Sejauh Linux berjalan, seseorang dapat menggunakan scriptperintah untuk merekam seluruh sesi. Itu adalah bagian dari util-linuxpaket jadi harus pada kebanyakan sistem Linux. Anda dapat membuat dan alias atau fungsi yang akan memanggil script -c pythondan yang akan disimpan ke typescriptfile. Misalnya, inilah cetak ulang satu file seperti itu.

$ 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

Kerugian kecil di sini adalah scriptmencatat semuanya, bahkan umpan baris, kapan pun Anda menekan spasi, dll. Jadi, Anda mungkin ingin menggunakan coluntuk membersihkan output (lihat posting ini di Unix & Linux Stackexchange ).

Sergiy Kolodyazhnyy
sumber
2

The %historyperintah mengagumkan, tapi sayangnya itu tidak akan membiarkan Anda menyimpan hal-hal yang% paste 'd ke sesh itu. Untuk melakukan itu saya pikir Anda harus melakukan %logstart di awal (walaupun saya belum mengkonfirmasi ini berfungsi).

Yang saya suka lakukan adalah

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

yang akan menyimpan output, nomor baris, dan '>>>' sebelum setiap input (opsi o, n, dan p). Lihat dokumen untuk% histori di sini .

kata selanjutnya
sumber
1

ada pilihan lain --- pyslice. dalam "demo dan alat wxpython 2.8 docs", ada program open source bernama "pyslices".

Anda dapat menggunakannya seperti editor, dan juga mendukung penggunaan seperti konsol ---- mengeksekusi setiap baris seperti interpreter interaktif dengan gema langsung.

tentu saja, semua blok kode dan hasil setiap blok akan direkam ke dalam file txt secara otomatis.

hasilnya dicatat tepat di belakang blok kode yang sesuai. sangat mudah.

ikhtisar pyslices

fandyst
sumber
Penulis PySlices di sini. Senang Anda menyukai PySlices (dan Anda bahkan menemukannya). Ini belum sepenuhnya meninggalkan ware (saya sebenarnya masih menggunakannya), tetapi versi yang termasuk dalam wxPython itu sendiri sering tidak berfungsi dengan baik. Jika Anda ingin mengikuti pembaruan, Anda bisa mendapatkannya dari paket wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David
1

Jika Anda menggunakan bpython , semua riwayat perintah secara default disimpan ke ~/.pythonhist.

Untuk menyimpan perintah untuk digunakan kembali nanti, Anda dapat menyalinnya ke file skrip python:

$ cp ~/.pythonhist mycommands.py

Kemudian edit file itu untuk membersihkannya dan meletakkannya di bawah jalur Python (paket-situs lingkungan global atau virtual, direktori saat ini, disebutkan dalam * .pth, atau cara lain).

Untuk memasukkan perintah ke dalam shell Anda, cukup impor dari file yang disimpan:

>>> from mycommands import *
Aidas Bendoraitis
sumber
penyelamat hidup. a sulit untuk menemukan jawaban
Mehdi LAMRANI
0

Beberapa komentar bertanya bagaimana cara menyimpan semua input IPython sekaligus. Untuk% save magic di IPython, Anda dapat menyimpan semua perintah secara terprogram seperti yang ditunjukkan di bawah ini, untuk menghindari pesan prompt dan juga untuk menghindari menentukan nomor input. currentLine = len (Dalam) -1% save -f my_session 1- $ currentLine

The -fopsi digunakan untuk memaksa penggantian file dan len(IN)-1menunjukkan input arus yang cepat di IPython, memungkinkan Anda untuk menyimpan seluruh sesi pemrograman.

EF Haghish
sumber
0

Bagi mereka yang menggunakan spacemacs, dan ipythonyang datang dengan python-layer, save magic menciptakan banyak output yang tidak diinginkan, karena perintah penyelesaian otomatis yang bekerja di backround seperti:

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)

Untuk menghindari ini, cukup simpan buffer ipython seperti yang biasanya Anda simpan: spc f s

Kaan E.
sumber
0

Saya ingin menyarankan cara lain untuk mempertahankan sesi python melalui tmux di linux. Anda menjalankan tmux, lampirkan diri Anda ke sesi yang Anda buka (jika tidak dilampirkan setelah membukanya secara langsung). jalankan python dan lakukan apa pun yang Anda lakukan di atasnya. kemudian lepaskan dari sesi. melepaskan diri dari sesi tmux tidak menutup sesi. sesi tetap terbuka.

pro dari metode ini: Anda dapat melampirkan sesi ini dari perangkat lain (jika Anda dapat ssh pc Anda)

kontra dari metode ini: metode ini tidak melepaskan sumber daya yang digunakan oleh sesi python yang dibuka sampai Anda benar-benar ada interpreter python.

Myonaiz
sumber
0

Untuk menyimpan input dan output di XUbuntu :

  1. Di XWindows, jalankan iPython dari aplikasi terminal Xfce
  2. klik Terminaldi bilah menu atas dan cari save contentsdi dropdown

Saya menemukan ini menyimpan input dan output, akan kembali ke ketika saya membuka terminal. Ini bukan ipython khusus, dan akan bekerja dengan sesi ssh atau tugas lain yang dijalankan dari jendela terminal.

Paul
sumber