Pythonインタラクティブセッションを保存する方法


416

データベースやファイルなどを操作するためにPythonのインタープリターを頻繁に使用していることに気づきました。基本的には、半構造化データの多くの手動フォーマットです。必要なビット数を適切に保存およびクリーンアップしません。入力をシェルに保存する方法はありますか(db接続、変数の割り当て、forループとロジックのビット)-インタラクティブセッションのいくつかの履歴?私が使うようなものを使うと、script標準ノイズが多すぎます。本当にすべてのオブジェクトをピクルする必要はありませんが、それを行うソリューションがある場合は問題ありません。理想的には、インタラクティブに作成したスクリプトとして実行されるスクリプトをそのまま残し、不要なビットを削除するだけで済みます。これを行うパッケージ、またはDIYアプローチはありますか?

更新:私はこれらのパッケージの品質と有用性に本当に驚いています。同様のかゆみを持つ人のために:

  • IPython-私が考えていたもののように、これを長い間使用していたはずです
  • 再対話 -非常に印象的です。視覚化についてもっと学びたいのですが、これはそこで輝くようです。グラフをインラインで表示するgtk / gnomeデスクトップアプリの一種。ハイブリッドシェル+グラフ計算機+ミニ食を想像してみてください。ソースの配布はこちら:http : //www.reinteract.org/trac/wiki/GettingIt。Ubuntuでうまく構築され、gnomeデスクトップ、WindowsおよびMacインストーラーにも統合されます。
  • bpython-非常にクールで多くの素晴らしい機能、autocomplete(!)、巻き戻し、1回のキーストロークによるファイルへの保存、インデント、よくできました。Pythonソース配布。sourceforgeからいくつかの依存関係を引き出しました。

私は回心しました、これらは本当に通訳と編集者の間のニーズを満たします。

回答:


411

IPythonは、インタラクティブセッションを使用する場合に非常に役立ちます。たとえば%saveマジックコマンドがあるユースケースでは%save my_useful_session 10-20 23入力行10〜20および23を保存するために入力するだけですmy_useful_session.py(これを支援するために、すべての行の先頭に番号が付けられます)。

さらに、ドキュメントには次のように記載されています。

この関数は、入力範囲に%historyと同じ構文を使用し、指定したファイル名に行を保存します。

これにより、たとえば、次のような古いセッションを参照できます。

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

プレゼンテーションページのビデオを見て機能の概要をすばやく確認してください


11
すべての行を保存する方法は?範囲を指定しないと、空のファイルが作成されます。:(
balki

40
@ balki、IPythonのプロンプトは、履歴に何行あるかを示します(つまりIn[48])。したがってsave filename 1-48、セッション全体が保存されます。
ベンページ

2
また、このファイルをipythonに再度ロードして、入力履歴をそのまま維持することは可能ですか?
ベンページ

15
@BenPage対話型コンソールに戻る前にファイルをロードするために、bash promtから保存された.pyファイルで「ipython -i [filename]」を使用します!(-iフラグがないと、ファイルの実行後にインタラクティブコンソールが表示されません)。
Samuel Lampa

9
@ user4779、予想通り:%load my_useful_session
Daniel Serodio 2017年

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 2014

4
@ubershmekel- Unix
Joel B

28
私のTI-83で失敗する
Dan

1
セッションの最後に必ず実行してください。最初に関数を呼び出した後、鉱山は少し空っぽに見えました。
dolphus333 2016

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システムでのみ機能することに注意してください。readlineはUnixプラットフォームでのみ利用可能です。


Mac OS Xはエディットラインを使用するため、利用可能なタブ完全機能がありますが、正確なコマンドは異なります:readline.parse_and_bind( "bind ^ I rl_complete")
Miles

それは素晴らしかった、ナディア、ありがとう。私は両方の答えを試します-ターゲットプラットフォームはUbuntu、BTWです
アンマウントされた

readline.parse_and_bind('tab: complete')MacPorts Pythonを使用している場合に機能します。
Phillip Cloud

3
これは額装されている必要があります。RHEL 6.6で作業しました。Pyenv、2.7.10。
BilliAm 2015

何年もの間、これを検索しなかったのはなぜですか。このソリューションは、高速で軽量な独自のツールを使用するので素晴らしいです。
イマン

75

IPythonを使用している場合は、マジック関数%history-fパラメータpeを指定して、以前のすべてのコマンドをファイルに保存できます。

%history -f /tmp/history.py

saveマジックを使用してファイルの場所がわからなかった。これは非常に役に立ちました
alpha_989

4
%history -g -f full_history.py現在のセッションだけでなく、すべてのセッションの履歴を取得するために使用します。参照:%historyのドキュメント
Evgeni Sergeev 2018年

19

Ipythonをインストールし、次のコマンドを実行してIpythonセッションを開いた後:

ipython

コマンドラインから、次のIpython 'magic'コマンドを実行して、Ipythonセッション全体を自動的にログに記録します。

%logstart

これにより、一意に名前が付けられた.pyファイルが作成され、インタラクティブIpythonセッションとして後で使用するために、または選択したスクリプトで使用するためにセッションが保存されます。



11

IPythonに加えて、同様のユーティリティbpythonには「入力したコードをファイルに保存する」機能があります。


3
誰がこれがbpythonでどのように行われるか説明できますか?私はctrl + sを試しましたが、うまくいきませんでした(Gnome端末を実行しているPython 3.4.3の上にバージョン0.14.2)
Yibo Yang

デフォルトではF7にバインドされています。F1はヘルプと現在のキーバインドを表示します。
ジムK.

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ステートメントが現在のディレクトリ(ipythonを開始した場所)のtest.pyファイルに保存されます。


3

入力履歴(およびオプションで出力)を印刷および保存するための%historyマジックがあります。

現在のセッションを次の名前のファイルに保存するにはmy_history.py

>>> %hist -f my_history.py

履歴IPythonは、入力したコマンドとそれが生成した結果の両方を保存します。上矢印キーと下矢印キーを使用して以前のコマンドを簡単に実行したり、より高度な方法で履歴にアクセスしたりできます。

%historyマジック関数を使用して、過去の入力と出力を調べることができます。以前のセッションからの入力履歴はデータベースに保存され、IPythonは出力履歴を保存するように構成できます。

%edit、%rerun、%recall、%macro、%save、%pastebinなど、他のいくつかの魔法の関数が入力履歴を使用できます。標準形式を使用して行を参照できます。

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

これは、現在のセッションの3行目と18​​〜20行目、および前のセッションの1〜5行目を使用します。

%historyを参照しますか?Docstringおよびその他の例については、

また、IPythonでの変数の軽量永続化のための%storeマジックの機能も必ず確認してください。

変数、エイリアス、マクロを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は、設定ファイルで有効にします。
Ikke

3

ボウルに別の提案を入れるだけです。 スパイダー

ここに画像の説明を入力してください

それは持っている履歴ログおよび変数エクスプローラを。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」をしたものを保存できません。そのためには最初にやらなければいけないと思います%logstart (ただし、この作品は確認していません)。

私がしたいのは

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

これは、各入力の前に出力、行番号、および「>>>」を保存します(o、n、およびpオプション)。ここで%historyのドキュメントを参照してください。


1

別のオプション--- pysliceがあります。「wxpython 2.8 docs demos and tools」には、「pyslices」という名前のオープンソースプログラムがあります。

あなたはそれをエディタのように使うことができ、コンソールのように使うこともサポートします-----各行をインタラクティブなインタプリタのように即座にエコーして実行します。

もちろん、コードのすべてのブロックと各ブロックの結果は、自動的にtxtファイルに記録されます。

結果は、対応するコードブロックのすぐ後ろに記録されます。とても便利。

pyslicesの概要


PySlicesの作成者はこちら。PySlicesが気に入って嬉しい(そしてそれを見つけた)。これはまだ完全に破棄されていません(実際にはまだ使用しています)が、wxPython自体に含まれているバージョンは、多くの場合うまく機能しません。更新を追跡したい場合は、wx_pyパッケージから取得できます:pypi.python.org/pypi/wx_py、github.com / davidmashburn / wx_py
David

1

bpythonを使用する場合、すべてのコマンド履歴はデフォルトでに保存されます~/.pythonhist

後で再利用するためにコマンドを保存するには、それらをpythonスクリプトファイルにコピーします。

$ cp ~/.pythonhist mycommands.py

次に、そのファイルを編集してクリーンアップし、Pythonパス(グローバルまたは仮想環境のサイトパッケージ、現在のディレクトリ、*。pthで言及されている、またはその他の方法)の下に置きます。

コマンドをシェルに含めるには、保存したファイルからコマンドをインポートするだけです。

>>> from mycommands import *

人生の救世主。答えを見つけるのは難しい
Mehdi LAMRANI

0

一部のコメントは、すべてのIPython入力を一度に保存する方法を尋ねていました。IPythonの%saveマジックでは、以下のようにプログラムですべてのコマンドを保存して、プロンプトメッセージを回避したり、入力番号の指定を回避したりできます。currentLine = len(In)-1%save -f my_session 1- $ currentLine

この-fオプションはファイルを強制的に置換するために使用され、len(IN)-1はIPythonで現在の入力プロンプトを表示し、セッション全体をプログラムで保存できるようにします。


0

を使用していて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


0

Linuxのtmuxを介してpythonセッションを維持する別の方法を提案したいと思います。tmuxを実行し、開いたセッションに自分をアタッチします(直接開いた後でアタッチされていない場合)。pythonを実行し、それに対して実行していることをすべて実行します。次に、セッションから切り離します。tmuxセッションから切り離しても、セッションは閉じません。セッションは開いたままです。

この方法の長所: 他のデバイスからこのセッションに接続できます(PCをsshできる場合)

このメソッドの短所: このメソッドは、実際にpythonインタープリターが存在するまで、開かれたpythonセッションで使用されるリソースを放棄しません。


0

XUbuntuで入力と出力を保存するには

  1. XWindowsでは、XfceターミナルアプリからiPythonを実行します
  2. Terminal上部のメニューバーをクリックしてsave contents、ドロップダウンを探します

これにより、入力と出力が保存され、端末を開いたときまで戻ります。これはipython固有ではなく、sshセッションまたはターミナルウィンドウから実行される他のタスクで動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.