web-dev-qa-db-ja.com

Pythonの対話型セッションを保存する方法

私はデータベースやファイルなどを扱うのにPythonのインタプリタを頻繁に使用しています。基本的には、半構造化データの手作業による書式設定がたくさんあります。私が望むほど有用な部分を適切に保存して整理することはしません。私の入力をシェルに保存する方法はありますか(db接続、変数代入、少しforループと少しのロジック) - 対話セッションの歴史。 scriptのようなものを使用すると、標準出力ノイズが多すぎます。実際にすべてのオブジェクトをpickle化する必要はありません。それを解決するソリューションがあれば、問題ありません。理想的には、対話的に作成したスクリプトとして実行されているスクリプトをそのまま残しておき、不要な部分を削除するだけで済みます。これを行うパッケージ、またはDIYのアプローチはありますか?

更新:これらのパッケージの品質と有用性に本当に驚いています。かゆみが似ている人のために:

  • IPython - これは長年使用していたはずです
  • reinteract - 非常に印象的です、私は視覚化についてもっと学びたいと思います、そしてそれはそこで輝くように思われます。グラフをインラインにレンダリングするgtk/gnomeデスクトップアプリケーションの一種。ハイブリッドシェル+グラフ電卓+ミニEclipseを想像してみてください。ここにソース配布: http://www.reinteract.org/trac/wiki/GettingIt 。 Ubuntu上でうまく構築され、GNOMEデスクトップ、WindowsおよびMacインストーラーにも統合します。
  • bpython - 非常にクールで、たくさんのNice機能、オートコンプリート(!)、巻き戻し、1回のキーストロークでファイルに保存、インデントなどがうまく行われています。 Pythonソース配布。sourceforgeからいくつかの依存関係を引き出しました。

私は回心しています、これらはインタプリタとエディタの間の必要性を本当に満たします。

388
unmounted

IPython あなたが対話型セッションを使うのが好きなら非常に役に立ちます。例えば、あなたのユースケースでは %saveマジックコマンド があります。入力行10から20と23を%save my_useful_session 10-20 23に保存するためにmy_useful_session.pyを入力するだけです(これを助けるために、すべての行に接頭辞が付きます)。 。

さらに、文書には次のように記載されています。

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

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

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

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

376
Ants Aasma

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

import readline
readline.write_history_file('/home/ahj/history')
143
Roberto Z

それには way があります。ファイルを~/.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プラットフォームでのみ利用可能です。

89
Nadia Alramli

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

%history -f /tmp/history.py
69
nachouve

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

ipython

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

%logstart

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

16
webappzero

また、 reinteract を使うと、Pythonセッションへのノートブックのようなインタフェースが得られます。

13
Ned Batchelder

IPythonに加えて、似たようなユーティリティ bpython "入力したコードをファイルに保存する"機能があります。

11
dbr

私は答えを見つけるのに苦労しなければなりませんでした、私は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

これはあなたの現在のディレクトリ(あなたがipythonを始めた場所)のtest.pyファイルにあなたのすべてのpythonステートメントを保存するでしょう。

6
Somum

入力履歴(およびオプションで出力)を印刷および保存するための%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行目が取得されます。

履歴を見るDocstringとより多くの例のために。

また、IPythonでの変数の軽量永続性のために、 %store magic の機能を必ず調べてください。

変数、エイリアス、マクロを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}

起動時に格納された変数を自動保存するには、ipython_config.pyでc.StoreMagic.autorestore = Trueを指定します。

3
Alexander

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

enter image description here

それは履歴ログ変数エクスプローラを持っています。もしあなたがMatLabを使ったことがあれば、あなたは類似点を見るでしょう。

3
Norfeldt

Linuxに関する限り、セッション全体を記録するためにscriptname__コマンドを使用できます。これはutil-linuxパッケージの一部なので、ほとんどのLinuxシステム上にあるはずです。 script -c pythonを呼び出し、TypeScriptname__ファイルに保存されるエイリアスまたは関数を作成できます。例えば、これはそのようなファイルの1つの再版です。

$ 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

ここでちょっと不利なのは、バックスペースを打ったときなどはいつでもscriptname__がすべてを記録し、改行も含むということです。そのため、colname__を使用して出力をクリーンアップすることができます( nixおよびLinux Stackexchangeの記事 を参照)。

2

別の選択肢があります--- pyslice。 「wxpython 2.8 docsデモとツール」には、「pyslices」という名前のオープンソースプログラムがあります。

あなたはそれをエディタのように使うことができ、コンソールのように使うこともサポートしています。

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

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

the overview of pyslices

1
fandyst

%historyコマンドは素晴らしいですが、残念ながらそれはあなたがseshに%貼り付けられたものを保存させません。そのためには、%logstart最初に を実行する必要があると思います(ただし、これは確認されていません)。

私がやりたいのは

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

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

1
wordsforthewise

入出力をXUbuntuに保存するため

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

これで入力と出力が節約され、端末を開いたときに戻ることがわかりました。これはipython固有のものではなく、sshセッションや端末ウィンドウから実行される他のタスクで機能します。

0
Paul

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

このメソッドの長所:あなたは他のデバイスからこのセッションに接続することができます(あなたのPCをSSH接続できる場合)

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

0
Myonaiz

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

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

0
E. F. Haghish

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

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

$ cp ~/.pythonhist mycommands.py

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

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

>>> from mycommands import *
0

spacemacs、およびpython-layerに付属のipythonを使用している場合は、次のような定数の自動補完コマンドがバックグラウンドで機能するため、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
Kaan E.