파이썬 대화식 세션을 저장하는 방법?


416

파이썬의 인터프리터를 사용하여 데이터베이스, 파일 등을 다루는 데 자주 사용됩니다. 기본적으로 반 구조적 데이터의 수동 형식이 많이 있습니다. 유용한 비트를 원하는만큼 자주 저장하고 정리하지 않습니다. 대화식 세션의 일부 기록 인 쉘 (DB 연결, 변수 할당, 작은 for 루프 및 비트)에 입력을 저장하는 방법이 있습니까? 내가 같은 script것을 사용하면 너무 많은 stdout 노이즈가 발생합니다. 나는 실제로 모든 객체를 피클 할 필요는 없습니다. 그러나 그렇게하는 해결책이 있다면 괜찮습니다. 이상적으로는 대화식으로 만든 스크립트로 실행되는 스크립트가 그대로 남아 있으며 필요하지 않은 비트를 삭제할 수 있습니다. 이 작업을 수행하는 패키지가 있습니까, 아니면 DIY 방식이 있습니까?

업데이트 : 나는이 패키지의 품질과 유용성에 정말 놀랐습니다. 가려움증이 비슷한 사람들의 경우 :

  • IPython-몇 년 동안 이것을 사용하고 있었어야합니다.
  • reinteract- 매우 인상적입니다. 시각화에 대해 더 많이 배우고 싶습니다. 그래프를 인라인으로 렌더링하는 gtk / gnome 데스크탑 앱의 일종. 하이브리드 쉘 + 그래프 계산기 + 미니 일식을 상상해보십시오. 여기에 소스 배포판 : http://www.reinteract.org/trac/wiki/GettingIt . Ubuntu에 잘 구축되어 그놈 데스크탑, Windows 및 Mac 설치 프로그램에도 통합됩니다.
  • bpython- 극도로 시원하고 멋진 기능, 자동 완성 (!), 되감기, 파일에 한 번의 키 스트로크 저장, 들여 쓰기 등이 있습니다. 파이썬 소스 배포는 sourceforge에서 몇 가지 종속성을 가져 왔습니다.

나는 회심하여 해석자와 편집자 사이의 필요를 채워줍니다.

답변:


411

IPython 은 대화식 세션을 사용하는 경우 매우 유용합니다. 귀하의 사용 사례에 대한 예를 들어이 마법 명령 , 방금 입력 10 ~ 20 및 23에 입력 라인을 저장 (모든 라인의 수에 의해 접두사이 함께 도움말을).%save%save my_useful_session 10-20 23my_useful_session.py

또한 설명서에는 다음이 명시되어 있습니다.

이 함수는 입력 범위에 대해 % history 와 동일한 구문을 사용한 다음 행을 지정한 파일 이름으로 저장합니다.

예를 들어 다음과 같은 이전 세션을 참조 할 수 있습니다.

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

기능에 대한 간략한 개요를 보려면 프리젠 테이션 페이지의 비디오를 보십시오 .


11
모든 줄을 저장하는 방법? 범위를 지정하지 않으면 빈 파일이 작성됩니다. :(
balki

40
IPython의 프롬프트 @balki는 역사에 몇 줄이 있는지 알려줍니다 In[48]. 따라서 save filename 1-48전체 세션을 저장합니다.
Ben 페이지

2
또한이 파일을 ipython으로 다시로드하고 입력 기록을 그대로 유지할 수 있습니까?
Ben 페이지

15
@BenPage 대화식 콘솔로 돌아 가기 전에 파일을 다시로드하려면 bash promt에서 저장된 .py 파일의 "ipython -i [filename]"을 사용하십시오! -i 플래그가 없으면 파일을 실행 한 후 대화식 콘솔을 얻을 수 없습니다.
사무엘 람파

9
@ user4779, 예상대로 :%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에서 나를 위해 빈 파일을 만듭니다
ubershmekel

10
우분투에서 나를 위해 매력처럼 일했습니다.
Johndt6

4
@ubershmekel - 외모가 같은 단지 유닉스에서 작동합니다
조엘 B

28
TI-83에서 실패
Dan

1
세션이 끝날 때해야합니다. 시작시에만 함수를 호출 한 후 광산이 약간 비어있는 것처럼 보였습니다.
dolphus333

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은 유닉스 플랫폼에서만 사용할 수 있습니다.


Mac OS X은 편집 선을 사용하므로 사용 가능한 탭 완성 기능이 있지만 정확한 명령은 다릅니다. readline.parse_and_bind ( "bind ^ I rl_complete")
Miles

나디아, 정말 고마워. 고마워. 나는 대답의 모두를하려고합니다 - 대상 플랫폼이 BTW 우분투입니다
마운트

readline.parse_and_bind('tab: complete')MacPorts Python을 사용하는 경우 작동합니다.
Phillip Cloud

3
프레임이 있어야합니다. RHEL 6.6에서 일했습니다. yen 브, 2.7.10.
BilliAm

내가이 몇 년 동안 이것을 찾지 못한 이유! 이 솔루션은 빠르고 가벼운 독창적 인 도구를 사용하는 것이 좋습니다.
iman

75

당신이 사용하는 경우 IPython을 당신은 마법의 함수를 사용하여 파일에 이전의 모든 명령을 저장할 수 있습니다 % 기록을-f 매개 변수, PE :

%history -f /tmp/history.py

save마법을 사용하여 파일의 위치를 ​​확신하지 못했습니다 . 이것은 매우 도움이되었습니다
alpha_989

4
%history -g -f full_history.py현재 세션뿐만 아니라 모든 세션에서 기록을 가져 오는 데 사용 합니다. % history에 대한 설명서 도 참조하십시오 .
Evgeni Sergeev

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은 도움말과 현재 키 바인딩을 보여줍니다.
Jim K.

F7은 외부 편집기를 시작합니다. Ctrl + s는 파일에 간단한 저장 기능을 요구하지만 bash 및 zsh에서는 "stop"에 바인딩되므로 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

입력 히스토리 (및 선택적으로 출력)를 인쇄하고 저장하기위한 % 히스토리 매직이 있습니다.

현재 세션을 파일 이름으로 저장하려면 다음을 수행하십시오 my_history.py.

>>> %hist -f my_history.py

기록 IPython은 입력 한 명령과 결과를 모두 저장합니다. 위쪽 및 아래쪽 화살표 키를 사용하여 이전 명령을 쉽게 수행하거나보다 복잡한 방식으로 기록에 액세스 할 수 있습니다.

% history magic 함수를 사용하여 과거 입력 및 출력을 검사 할 수 있습니다. 이전 세션의 입력 기록은 데이터베이스에 저장되며 출력 기록을 저장하도록 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}

시작시 저장된 변수를 자동 c.StoreMagic.autorestore = True복원 하려면 ipython_config.py에 지정 하십시오.


c.HistoryManager.db_log_output구성 파일에서 활성화하여 출력 기록 저장을 활성화 할 수 있습니다 .
Ikke

3

그릇에 또 다른 제안을 넣으면 : Spyder

여기에 이미지 설명을 입력하십시오

그것은이 역사 로그변수 탐색기를 . MatLab으로 작업했다면 유사점을 볼 수 있습니다.


2

리눅스가가는 한, 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명령은 훌륭하지만 불행히도 % s 붙여 넣은 것을 저장하지 않습니다. 그렇게하려면 %logstart 처음 에해야한다고 생각합니다 (이 작품을 확인하지는 않았지만).

내가 좋아하는 것은

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

각 입력 전에 출력, 줄 번호 및 '>>>'를 저장합니다 (o, n 및 p 옵션). % history에 대한 문서는 여기 를 참조 하십시오 .


1

다른 옵션 --- pyslice가 있습니다. "wxpython 2.8 문서 데모 및 도구"에는 "pyslices"라는 오픈 소스 프로그램이 있습니다.

편집기처럼 사용할 수 있으며 콘솔처럼 사용할 수 있습니다 ---- 즉각적인 에코를 사용하여 대화식 인터프리터처럼 각 줄을 실행합니다.

물론 모든 코드 블록과 각 블록의 결과는 txt 파일에 자동으로 기록됩니다.

결과는 해당 코드 블록 뒤에 기록됩니다. 매우 편리합니다.

pyslices 개요


PySlices 작성자는 여기에 있습니다. PySlices를 좋아하고 기쁘다. 아직 포기하지는 않았지만 (실제로는 여전히 사용하고 있지만) wxPython 자체에 포함 된 버전이 종종 제대로 작동하지 않습니다. 업데이트를 따르십시오 당신은 wx_py 패키지에서 그들을 얻을 수 있습니다 pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
데이비드

1

bpython 을 사용 하면 모든 명령 기록이 기본적으로에 저장됩니다 ~/.pythonhist.

나중에 다시 사용하기 위해 명령을 저장하려면 해당 명령을 파이썬 스크립트 파일로 복사하면됩니다.

$ cp ~/.pythonhist mycommands.py

그런 다음 해당 파일을 정리하여 정리하고 Python 경로 (전역 또는 가상 환경의 사이트 패키지, 현재 디렉토리, * .pth 또는 다른 방법)에 넣으십시오 .

쉘에 명령을 포함 시키려면 저장된 파일에서 명령을 가져 오십시오.

>>> from mycommands import *

구세주. 답을 찾기 어렵다
Mehdi LAMRANI

0

일부 의견은 모든 IPython 입력을 한 번에 저장하는 방법을 묻고있었습니다. IPython에서 % save magic의 경우 프롬프트 메시지를 피하고 입력 번호를 지정하지 않도록 아래에 표시된대로 프로그래밍 방식으로 모든 명령을 저장할 수 있습니다. currentLine = len (In) -1 % save -f my_session 1- $ currentLine

-f옵션은 파일 교체를 강제하는 데 사용 len(IN)-1되며 IPython에서 현재 입력 프롬프트를 표시하여 전체 세션을 프로그래밍 방식으로 저장할 수 있습니다.


0

을 사용 spacemacs하고 ipython그와 함께 제공되는 경우 python-layer, save magic은 다음과 같이 backround에서 작동하는 지속적인 자동 완성 명령으로 인해 많은 원치 않는 출력을 생성합니다.

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

리눅스에서 tmux를 통해 파이썬 세션을 유지하는 다른 방법을 제안하고 싶습니다. tmux를 실행하고 열린 세션에 직접 연결하십시오 (직접 연 후 연결되지 않은 경우). 파이썬을 실행하고 당신이하고있는 일을하십시오. 그런 다음 세션에서 분리하십시오. tmux 세션에서 분리해도 세션이 닫히지 않습니다. 세션은 열려 있습니다.

이 방법의 장점 : 다른 장치 에서이 세션에 연결할 수 있습니다 (PC를 ssh 할 수있는 경우)

이 방법의 단점 : 이 방법은 실제로 파이썬 인터프리터가 존재할 때까지 열린 파이썬 세션에서 사용하는 리소스를 포기하지 않습니다.


0

분투에 입력과 출력을 저장하려면 :

  1. XWindows의 경우 Xfce 터미널 앱에서 iPython을 실행하십시오.
  2. Terminal상단 메뉴 표시 줄을 클릭 save contents하고 드롭 다운에서 찾으 십시오.

나는 이것이 입력과 출력을 저장하고 터미널을 열었을 때로 되돌아갑니다. 이것은 ipython과 관련이 없으며 ssh 세션이나 터미널 창에서 실행되는 다른 작업에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.