Bir Python etkileşimli oturumu nasıl kaydedilir?


416

Kendimi veritabanları, dosyalar, vb. İle çalışmak için sık sık Python'un yorumlayıcısını kullanıyorum - temel olarak yarı yapılandırılmış verilerin çok sayıda manuel biçimlendirmesi. Faydalı bitleri istediğim sıklıkta düzgün bir şekilde kaydetmiyorum ve temizlemiyorum. Kabuğuma girdilerimi kaydetmenin bir yolu var mı (db bağlantıları, değişken atamalar, döngüler ve mantık bitleri için çok az) - etkileşimli oturumun bazı geçmişi? Benim gibi bir şey kullanırsam scriptçok fazla stdout gürültü alıyorum. Gerçekten tüm nesneleri seçmem gerekmiyor - bunu yapan bir çözüm varsa, sorun olmaz. İdeal olarak, etkileşimli olarak oluşturduğum gibi çalışan bir senaryo ile kaldım ve ihtiyacım olan bitleri silebilirdim. Bunu yapan bir paket veya DIY yaklaşımı var mı?

GÜNCELLEME : Bu paketlerin kalitesine ve kullanışlılığına gerçekten şaşırdım. Benzer kaşıntıya sahip olanlar için:

  • IPython - bunu uzun süredir kullanıyor olmalıydım, aklımdaki gibi
  • yeniden etkileşim - çok etkileyici, görselleştirme hakkında daha fazla bilgi edinmek istiyorum ve bu orada parlayacak gibi görünüyor. Grafikleri yerinde yapan bir gtk / gnome masaüstü uygulaması. Hibrit bir kabuk + grafik hesap makinesi + mini tutulma düşünün. Kaynak dağılımı burada: http://www.reinteract.org/trac/wiki/GettingIt . Ubuntu üzerinde iyi tasarlanmış, gnome masaüstü, Windows ve Mac yükleyicilerine de entegre olur.
  • bpython - son derece havalı, çok güzel özellikler, otomatik tamamlama (!), geri sarma, bir tuşa dosya kaydetme, girinti, aferin. Python kaynak dağıtımı, sourceforge'dan birkaç bağımlılık çekti.

Dönüştürüldüm, bunlar gerçekten tercüman ve editör arasındaki bir ihtiyacı dolduruyor.

Yanıtlar:


411

Etkileşimli oturumlar kullanmak istiyorsanız, IPython son derece kullanışlıdır. Örneğin, kullanım durumunuz için %savesihirli komut vardır , sadece %save my_useful_session 10-20 2310 ila 20 ve 23 giriş satırlarını kaydetmek için giriş yaparsınız my_useful_session.py(buna yardımcı olmak için her satırın numarasının önüne eklenir).

Ayrıca, belgeler şunları belirtmektedir:

Bu işlev, giriş aralıkları için % geçmişiyle aynı sözdizimini kullanır ve ardından çizgileri belirttiğiniz dosya adına kaydeder.

Bu, örneğin,

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

Özelliklere hızlı bir genel bakış için sunum sayfasındaki videolara bakın .


11
Tüm çizgiler nasıl kaydedilir? Aralığı belirtmeden boş bir dosya oluşturur. :(
balki

40
@balki, IPython'un istemi size geçmişinizde kaç satır olduğunu gösterir (yani In[48]). Böylece save filename 1-48tüm oturumunuzu kurtaracaksınız.
Ben Sayfa

2
Ayrıca, bu dosyayı ipython'a geri yüklemek ve giriş geçmişinizi sağlam tutmak mümkün mü?
Ben Sayfa

15
@BenPage Etkileşimli bir konsola dönmeden önce dosyayı geri yüklemek için bash promt'ten kaydedilmiş .py dosyasında "ipython -i [dosyaadı]" kullanın! (-i bayrağı olmadan dosyayı çalıştırdıktan sonra etkileşimli konsolu alamazsınız).
Samuel Lampa

9
@ user4779, beklendiği gibi:%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')

10
Windows 7'de benim için boş bir dosya oluşturur
ubershmekel

10
Ubuntu'da benim için bir cazibe gibi çalıştı.
Johndt6

4
@ubershmekel - Görünüşe göre sadece Unix üzerinde çalışıyor
Joel B

28
TI-83'ümde başarısız
Dan

1
Seansınızın sonunda yapmayı unutmayın. Benimki işlevi sadece başlangıçta çağırdıktan sonra biraz boş görünüyordu.
dolphus333

95

Bunu yapmanın bir yolu var. Dosyayı şurada sakla ~/.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

ve ardından PYTHONSTARTUPkabuğunuzdaki ortam değişkenini ayarlayın (örneğin, içinde ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Otomatik tamamlamayı ücretsiz almak için bunu da ekleyebilirsiniz:

readline.parse_and_bind('tab: complete')

Bunun yalnızca * nix sistemlerinde çalışacağını lütfen unutmayın. Readline yalnızca Unix platformunda kullanılabilir.


Mac OS X, editline kullanıyor, bu nedenle sekme tamamlama işlevselliği var, ancak kesin komut farklı: readline.parse_and_bind ("bind ^ I rl_complete")
Miles

Çok çılgındı, Nadia, çok teşekkürler. Her iki yanıtı da deneyeceğim - hedef platform Ubuntu, BTW
unmounted

readline.parse_and_bind('tab: complete')MacPorts Python kullanıyorsanız çalışır.
Phillip Cloud

3
Bu çerçevelenmelidir. RHEL 6.6 üzerinde çalıştı. Pyenv, 2.7.10.
BilliAm

Neden tüm bu yılları aramadım! Bu çözüm, hızlı ve hafif orijinal araç kullandığından harikadır.
iman

75

Eğer kullanıyorsanız IPython sihirli işlevini kullanarak bir dosyaya tüm önceki komutları kaydedebilirsiniz % geçmişini ile -f parametresi, pe:

%history -f /tmp/history.py

saveSihirli kullanarak dosyanın konumu hakkında emin değildi . Bu çok yardımcı oldu
alpha_989

4
%history -g -f full_history.pyYalnızca geçerli oturumdan değil, tüm oturumlardan geçmiş almak için kullanın . Ayrıca bkz: % geçmiş için belgeler .
Evgeni Sergeev

19

Ipython'u yükledikten ve şu komutu çalıştırarak bir Ipython oturumu açtıktan sonra :

ipython

Komut satırınızdan tüm Ipython oturumunuzu otomatik olarak kaydetmek için aşağıdaki Ipython 'magic' komutunu çalıştırmanız yeterlidir:

%logstart

Bu, benzersiz olarak adlandırılmış bir .py dosyası oluşturur ve oturumunuzu daha sonra etkileşimli bir Ipython oturumu olarak kullanmak veya seçtiğiniz komut dosyalarında kullanmak için depolar.



11

IPython'a ek olarak, benzer bir yardımcı program bpython'un "bir dosyaya girdiğiniz kodu kaydet" özelliği vardır


3
bpython ile bunun nasıl yapıldığını kimse açıklayabilir mi? Ctrl + s denedim ama işe yaramadı (Gnome terminalini çalıştıran Python 3.4.3'ün üstünde 0.14.2 sürümü)
Yibo Yang

Varsayılan olarak F7'ye bağlıdır. F1 size yardım ve güncel tuş bağlantılarını gösterecektir.
Jim K.

F7 harici düzenleyiciyi başlatır. Ctrl + s dosyaya basit bir kaydetme özelliği istemelidir, ancak bash ve zsh içinde "durmak" zorundadır, bu nedenle bpython yapılandırmasında bir alternatif seçmeniz gerekir.
RCross

8

Bir cevap bulmak için mücadele etmek zorunda kaldım, iPython ortamında çok yeniydim.

Bu çalışacak

İPython oturumunuz böyle görünüyorsa

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'den 135'e kadar olan satırları kaydetmek istiyorsanız, aynı ipython oturumunda bu komutu kullanın

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

Bu, tüm python ifadelerinizi geçerli dizininizdeki (ipython'u başlattığınız) test.py dosyasına kaydedecektir.


3

Giriş geçmişini (ve isteğe bağlı olarak çıktıyı) yazdırmak ve kaydetmek için% geçmiş büyüsü vardır.

Geçerli oturumunuzu adlı bir dosyaya kaydetmek için my_history.py:

>>> %hist -f my_history.py

Geçmiş IPython, girdiğiniz komutları ve ürettiği sonuçları saklar. Yukarı ve aşağı ok tuşlarıyla önceki komutları kolayca gözden geçirebilir veya geçmişinize daha karmaşık yollarla erişebilirsiniz.

Geçmiş girdi ve çıktıları incelemek için% history magic işlevini kullanabilirsiniz. Önceki oturumlardan gelen girdi geçmişi bir veritabanına kaydedilir ve IPython çıktı geçmişini kaydetmek için yapılandırılabilir.

% Edit,% rerun,% hatırlama,% makro,% save ve% pastebin dahil olmak üzere diğer sihirli işlevler giriş geçmişinizi kullanabilir. Satırlara başvurmak için standart bir biçim kullanabilirsiniz:

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

Bu, geçerli oturumdan satır 3 ve satır 18 ila 20'yi ve bir önceki oturumdan 1-5 satırlarını alır.

% Geçmişi görüyor musunuz? Docstring ve daha fazla örnek için.

Ayrıca, IPython'daki değişkenlerin hafif kalıcılığı için % store magic'in yeteneklerini keşfettiğinizden emin olun .

Değişkenleri, takma adları ve makroları IPython veritabanında saklar.

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}

Kayıtlı değişkenleri başlangıçta otomatik c.StoreMagic.autorestore = Trueolarak kaydetmek için ipython_config.py içinde belirtin.


Çıktı geçmişini kaydetmeyi etkinleştirme c.HistoryManager.db_log_output, yapılandırma dosyasında etkinleştirilerek yapılabilir .
Ikke

3

Kaseye başka bir öneride bulunmak: Spyder

resim açıklamasını buraya girin

Bu sahiptir Tarih günlüğünü ve Değişken kaşif . MatLab ile çalıştıysanız, benzerlikleri görürsünüz.


2

Linux ilerledikçe, scripttüm oturumu kaydetmek için komut kullanılabilir . util-linuxPaketin bir parçasıdır, bu yüzden çoğu Linux sisteminde olması gerekir. script -c pythonArayacak ve bir typescriptdosyaya kaydedilecek diğer ad veya işlev oluşturabilir ve oluşturabilirsiniz . Örneğin, bu tür bir dosyanın yeniden yazdırılması.

$ 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

Burada Küçük dezavantaj olduğunu scriptKullanmak isteyebilirsiniz Yani, vb backspaces vurduğuz kayıtları her şeyi, hatta çizgi-beslemeler, colçıktısını temizlemek için (bkz Unix & Linux Stack Exchange bu gönderiye ).


2

%historyKomut müthiş, ama ne yazık ki size Sesh içine% macunu 'd olan şeyleri kaydetmek izin vermez. Bunu yapmak %logstart için başlangıçta yapmanız gerektiğini düşünüyorum (bu işi onaylamamış olmama rağmen).

Yapmayı sevdiğim şey

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

her girişten önce çıkışı, satır numaralarını ve '>>>' kaydeder (o, n ve p seçenekleri). % Tarihi için dokümanlar bakın burada .


1

başka bir seçenek var --- pyslice. "wxpython 2.8 dokümanlar demoları ve araçları" nda "pyslices" adlı açık kaynaklı bir program vardır.

bir editör gibi kullanabilirsiniz ve bir konsol gibi kullanmayı da destekler ---- her satırı anında yankı ile etkileşimli bir yorumlayıcı gibi yürütme.

elbette, tüm blok blokları ve her bloğun sonuçları otomatik olarak bir txt dosyasına kaydedilecektir.

sonuçlar, karşılık gelen kod bloğunun hemen arkasına kaydedilir. çok uygun.

fiziklere genel bakış


PySlices burada yazar. PySlices'i sevmene sevindim (ve onu buldun bile). Henüz oldukça terkedilmiş değil (aslında hala kullanıyorum), ancak wxPython'un içerdiği sürüm genellikle iyi çalışmıyor. Güncellemeleri takip etmek isterseniz, bunları wx_py paketinden alabilirsiniz: pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David

1

Eğer kullanırsanız bpython , tüm komut geçmişi kaydedilir varsayılan olarak ~/.pythonhist.

Daha sonra yeniden kullanılmak üzere komutları kaydetmek için bunları bir python komut dosyasına kopyalayabilirsiniz:

$ cp ~/.pythonhist mycommands.py

Sonra dosyayı temizlemek için düzenleyin ve Python yolunun altına koyun (genel veya sanal ortamın site paketleri, geçerli dizini, * .pth veya başka bir şekilde bahsederek).

Komutları kabuğunuza eklemek için, kaydedilen dosyadan içe aktarmanız yeterlidir:

>>> from mycommands import *

hayat kurtarıcı. bulmak zor
Mehdi LAMRANI

0

Bazı yorumlar tüm IPython girişlerinin bir kerede nasıl kaydedileceğini soruyordu. IPython'da% magic sihiri için, bilgi isteminden kaçınmak ve giriş numaralarını belirtmekten kaçınmak için tüm komutları aşağıda gösterildiği gibi programlı olarak kaydedebilirsiniz. currentLine = len (In) -1% kaydet -f benim_session 1- $ currentLine

Bu -fseçenek dosya değiştirmeye zorlamak için kullanılır ve len(IN)-1IPython'daki geçerli giriş istemini gösterir ve tüm oturumu programlı olarak kaydetmenizi sağlar.


0

Artırılmış sihir kullananlar spacemacsve ipythonbununla birlikte gelenler için , python-layerartalanlarında sürekli olarak otomatik tamamlama komutu nedeniyle çok sayıda istenmeyen çıktı oluşturur:

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)

Bundan kaçınmak için, normalde diğerlerini kaydettiğiniz gibi ipython arabelleğini kaydedin: spc f s


0

Linux üzerinde tmux üzerinden python oturumu sürdürmenin başka bir yolunu önermek istiyorum. tmux çalıştırırsanız, kendinizi açtığınız oturuma ekleyin (doğrudan açtıktan sonra eklenmezse). Python'u çalıştır ve üzerinde ne yaparsan yap. sonra oturumdan ayırın. tmux oturumundan ayrılmak oturumu kapatmaz. oturum açık kalır.

Bu yöntemin artıları: Bu oturuma başka bir cihazdan ekleyebilirsiniz (eğer pc'nizi ssh yapabilirsiniz)

Bu yöntemin eksileri: Bu yöntem, aslında python yorumlayıcısı var olana kadar açılan python oturumu tarafından kullanılan kaynakları bırakmaz.


0

XUbuntu'ya giriş ve çıkışı kaydetmek için :

  1. XWindows'da, Xfce terminal uygulamasından iPython'u çalıştırın
  2. tıklayın TerminalÜst menü çubuğunda ve aramaya save contentsaçılır listede

Bunun, girişi ve çıkışı kurtardığını ve terminali açtığım zamana kadar geri gittiğini görüyorum. Bu ipython'a özgü değildir ve ssh oturumları veya terminal penceresinden çalıştırılan diğer görevlerle çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.