จะบันทึกเซสชันการโต้ตอบ Python ได้อย่างไร?


416

ฉันพบว่าตัวเองใช้ล่ามของ Python บ่อยครั้งในการทำงานกับฐานข้อมูลไฟล์และอื่น ๆ - โดยทั่วไปแล้วการจัดรูปแบบด้วยตนเองของข้อมูลกึ่งโครงสร้าง ฉันไม่ได้บันทึกและล้างบิตที่มีประโยชน์อย่างถูกต้องบ่อยเท่าที่ฉันต้องการ มีวิธีบันทึกอินพุตของฉันลงในเชลล์ (การเชื่อมต่อฐานข้อมูลการกำหนดตัวแปรเล็ก ๆ น้อย ๆ สำหรับลูปและบิตของตรรกะ) - ประวัติของเซสชันแบบโต้ตอบหรือไม่? ถ้าฉันใช้บางอย่างเช่นscriptฉันได้รับเสียง stdout มากเกินไป ฉันไม่จำเป็นต้องดองวัตถุทั้งหมด - แม้ว่าจะมีวิธีแก้ปัญหามันก็คงจะโอเค เป็นการดีที่ฉันจะเหลือสคริปต์ที่วิ่งตามที่ฉันสร้างขึ้นแบบโต้ตอบและฉันสามารถลบบิตที่ฉันไม่ต้องการ มีแพ็คเกจที่ทำสิ่งนี้หรือวิธี DIY

UPDATE : ฉันประหลาดใจมากกับคุณภาพและประโยชน์ของแพ็คเกจเหล่านี้ สำหรับผู้ที่มีอาการคันที่คล้ายกัน:

  • IPython - ควรใช้สิ่งนี้มานานแล้วเป็นสิ่งที่ฉันมีอยู่ในใจ
  • reinteract - น่าประทับใจมากฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการสร้างภาพและดูเหมือนว่ามันจะส่องแสงที่นั่น จัดเรียงแอปเดสก์ท็อป gtk / gnome ที่แสดงกราฟแบบอินไลน์ ลองจินตนาการถึงเครื่องคิดเลขเชลล์ไฮบริด + กราฟ + มินิคราส แหล่งที่มาของการจัดจำหน่ายที่นี่: http://www.reinteract.org/trac/wiki/GettingIt สร้างได้ดีบน Ubuntu รวมเข้ากับเดสก์ท็อป GNOME, Windows และ Mac ด้วย
  • bpython คุณสมบัติสุดเจ๋งมากมายการเติมข้อความอัตโนมัติ (!) กรอกลับกดแป้นพิมพ์หนึ่งครั้งเป็นไฟล์บันทึกการเยื้องทำได้ดีมาก การกระจายแหล่ง Python ดึงการอ้างอิงสองรายการจาก sourceforge

ฉันกลับใจใหม่แล้วสิ่งเหล่านี้เติมเต็มความต้องการระหว่างล่ามและบรรณาธิการ

คำตอบ:


411

IPythonมีประโยชน์อย่างยิ่งหากคุณต้องการใช้เซสชันแบบโต้ตอบ ตัวอย่างเช่นสำหรับการใช้งานในกรณีของคุณมีคำสั่งมายากลคุณเพียงแค่ป้อนข้อมูลเพื่อบันทึกการป้อนข้อมูลสาย 10 ถึง 20 และ 23 (เพื่อความช่วยเหลือเกี่ยวกับเรื่องนี้ทุกบรรทัดจะนำหน้าด้วยจำนวน)%save%save my_useful_session 10-20 23my_useful_session.py

นอกจากนี้เอกสารระบุสถานะ:

ฟังก์ชั่นนี้ใช้ไวยากรณ์เดียวกันกับ% ประวัติสำหรับช่วงอินพุตจากนั้นบันทึกบรรทัดไปยังชื่อไฟล์ที่คุณระบุ

สิ่งนี้ช่วยให้ตัวอย่างเช่นการอ้างอิงเซสชันที่มีอายุมากกว่าเช่น

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

ดูวิดีโอในหน้าการนำเสนอเพื่อรับภาพรวมของคุณสมบัติ


11
บันทึกทุกบรรทัดได้อย่างไร มันจะสร้างไฟล์เปล่าโดยไม่ระบุช่วง :(
balki

40
@balki ข้อความแจ้งของ IPython จะบอกคุณว่ามีกี่บรรทัดในประวัติของคุณ (เช่นIn[48]) ดังนั้นsave filename 1-48จะบันทึกเซสชั่นทั้งหมดของคุณ
เบ็นหน้า

2
นอกจากนี้ยังเป็นไปได้หรือไม่ที่จะโหลดไฟล์นี้กลับไปยัง ipython และเก็บประวัติการป้อนข้อมูลของคุณไว้เหมือนเดิม?
เบ็นหน้า

15
@BenPage ใช้ "ipython -i [filename]" ในไฟล์. py ที่บันทึกไว้จาก bash promt เพื่อโหลดไฟล์กลับมาก่อนที่จะกลับไปที่คอนโซลแบบโต้ตอบ! (หากไม่มีแฟล็ก -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
ทำงานเหมือนจับใจฉันใน Ubuntu
Johndt6

4
@ubershmekel - ดูเหมือนว่าจะใช้ได้กับ Unix เท่านั้น
Joel B

28
Fail on TI-83 ของฉัน
Dan

1
จำไว้ว่าให้ทำตอนท้ายเซสชั่นของคุณ Mine ดูค่อนข้างว่างเปล่าหลังจากเรียกใช้ฟังก์ชั่นเฉพาะตอนเริ่มต้นเท่านั้น
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 มีให้เฉพาะในแพลตฟอร์ม Unix


Mac OS X ใช้ editline ดังนั้นจึงมีฟังก์ชั่นการใช้แท็บที่สมบูรณ์ แต่คำสั่งที่แน่นอนนั้นแตกต่างกัน: readline.parse_and_bind ("bind ^ I rl_complete")
Miles

มันเร็วอย่างบ้าคลั่งนาเดียขอบคุณมาก ฉันจะลองคำตอบทั้งสอง - แพลตฟอร์มเป้าหมายคือ Ubuntu, BTW
unmounted

readline.parse_and_bind('tab: complete')ใช้งานได้ถ้าคุณใช้ MacPorts Python
Phillip Cloud

3
นี่ควรเป็นกรอบ ทำงานบน RHEL 6.6 Pyenv, 2.7.10
BilliAm

ทำไมฉันไม่ค้นหาสิ่งเหล่านี้ตลอดหลายปีที่ผ่านมา! โซลูชันนี้ยอดเยี่ยมเนื่องจากใช้เครื่องมือดั้งเดิมที่รวดเร็วและเบา
iman

75

หากคุณกำลังใช้IPythonคุณสามารถบันทึกลงในไฟล์คำสั่งก่อนหน้าทั้งหมดของคุณโดยใช้ฟังก์ชั่น magic history%ด้วยพารามิเตอร์-f , pe:

%history -f /tmp/history.py

ไม่แน่ใจเกี่ยวกับตำแหน่งของไฟล์โดยใช้saveเวทมนต์ สิ่งนี้มีประโยชน์มาก
alpha_989

4
ใช้%history -g -f full_history.pyเพื่อรับประวัติจากทุกเซสชันไม่ใช่เฉพาะเหตุการณ์ปัจจุบัน ดูเพิ่มเติม: เอกสารสำหรับประวัติ%
Evgeni Sergeev

19

หลังจากติดตั้งIpythonและเปิดเซสชัน Ipython โดยเรียกใช้คำสั่ง:

ipython

จากบรรทัดคำสั่งของคุณเพียงแค่เรียกใช้คำสั่ง 'magic' Ipython ต่อไปนี้เพื่อบันทึกเซสชัน Ipython ทั้งหมดของคุณโดยอัตโนมัติ:

%logstart

สิ่งนี้จะสร้างไฟล์. py ที่มีชื่อไม่ซ้ำกันและเก็บเซสชันของคุณเพื่อใช้ในภายหลังเป็นเซสชัน Ipython แบบโต้ตอบหรือเพื่อใช้ในสคริปต์ที่คุณเลือก


14

นอกจากนี้reinteractยังให้อินเทอร์เฟซที่เหมือนกับโน้ตบุ๊กในเซสชัน Python


4
reinteractตอนนี้ถูกแทนที่โดย IPython Notebook และ QtConsole แล้ว
Eric O Lebigot

11

นอกเหนือจาก IPython ยูทิลิตี้bpython ที่คล้ายกันมีคุณสมบัติ "บันทึกรหัสที่คุณป้อนไปยังไฟล์"


3
ใครสามารถอธิบายวิธีการนี้จะทำกับ bpython? ฉันลอง ctrl + s แต่มันใช้งานไม่ได้ (เวอร์ชั่น 0.14.2 ด้านบนของ Python 3.4.3 ที่รัน terminal Gnome)
Yibo Yang

มันถูกผูกไว้กับ F7 โดยค่าเริ่มต้น F1 จะแสดงให้คุณเห็นวิธีใช้และการโยงคีย์ปัจจุบัน
Jim 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 ทั้งหมดของคุณในไฟล์ test.py ในไดเรกทอรีปัจจุบันของคุณ (ที่คุณเริ่มต้น ipython)


3

มี% history magic สำหรับการพิมพ์และบันทึกประวัติอินพุต (และเลือกเอาต์พุต)

ในการจัดเก็บเซสชันปัจจุบันของคุณไปยังไฟล์ชื่อmy_history.py:

>>> %hist -f my_history.py

ประวัติ IPython เก็บทั้งคำสั่งที่คุณป้อนและผลลัพธ์ที่ได้ คุณสามารถทำตามคำสั่งก่อนหน้าได้อย่างง่ายดายด้วยปุ่มขึ้นและลงลูกศรหรือเข้าถึงประวัติของคุณด้วยวิธีที่ซับซ้อนกว่า

คุณสามารถใช้ฟังก์ชัน% history magic เพื่อตรวจสอบอินพุตและเอาต์พุตที่ผ่านมา ประวัติอินพุตจากเซสชันก่อนหน้าจะถูกบันทึกในฐานข้อมูลและ IPython สามารถกำหนดค่าให้บันทึกประวัติเอาต์พุต

ฟังก์ชั่นเวทย์มนตร์อื่น ๆ สามารถใช้ประวัติการป้อนข้อมูลของคุณรวมถึง% edit,% rerun, การเรียกคืน%, มาโคร%,% save และ% pastebin คุณสามารถใช้รูปแบบมาตรฐานเพื่ออ้างอิงบรรทัด:

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

สิ่งนี้จะใช้บรรทัดที่ 3 และ 18 ถึง 20 จากเซสชันปัจจุบันและบรรทัดที่ 1-5 จากเซสชันก่อนหน้า

ดู% ประวัติศาสตร์? สำหรับ Docstring และตัวอย่างอื่น ๆ

นอกจากนี้อย่าลืมสำรวจความสามารถของ% เก็บเวทย์เพื่อการคงอยู่ของตัวแปรใน IPython ที่มีน้ำหนักเบา

เก็บตัวแปรนามแฝงและมาโครในฐานข้อมูลของ 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

เท่าที่ 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 เข้า sesh เมื่อต้องการทำเช่นนั้นฉันคิดว่าคุณต้องทำ%logstart ตั้งแต่ต้น (แม้ว่าฉันจะยังไม่ได้ยืนยันงานนี้)

สิ่งที่ฉันชอบทำคือ

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

ซึ่งจะบันทึกเอาต์พุตหมายเลขบรรทัดและ '>>>' หน้าอินพุตแต่ละตัว (ตัวเลือก o, n และ p) ดูเอกสารสำหรับประวัติ% ที่นี่


1

มีตัวเลือกอื่น --- pyslice ใน "การสาธิตและเครื่องมือของ wxpython 2.8 doc" มีโปรแกรมโอเพ่นซอร์สชื่อ "pyslices"

คุณสามารถใช้มันเหมือนเครื่องมือแก้ไขและมันยังรองรับการใช้งานเหมือนคอนโซล ---- ดำเนินการแต่ละบรรทัดเหมือนล่ามแบบโต้ตอบพร้อมเสียงก้องทันที

แน่นอนบล็อกทั้งหมดของรหัสและผลลัพธ์ของแต่ละบล็อกจะถูกบันทึกลงในไฟล์ txt โดยอัตโนมัติ

ผลลัพธ์จะถูกบันทึกไว้ด้านหลังบล็อกของรหัสที่เกี่ยวข้อง สะดวกมาก.

ภาพรวมของ pyslices


ผู้เขียน PySlices ที่นี่ ดีใจที่คุณชอบ PySlices (และคุณยังพบมัน) มันยังไม่ค่อยละทิ้งเครื่อง (จริง ๆ แล้วฉันยังใช้อยู่) แต่รุ่นที่รวมอยู่ใน wxPython มักจะทำงานได้ไม่ดีนัก หากคุณต้องการที่จะปฏิบัติตามการปรับปรุงคุณสามารถรับได้จากแพคเกจ wx_py: pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
เดวิด

1

ถ้าคุณใช้bpython~/.pythonhistทั้งหมดประวัติคำสั่งของคุณคือการเริ่มต้นการบันทึกไว้ใน

เพื่อบันทึกคำสั่งสำหรับ reusage ในภายหลังคุณสามารถคัดลอกไปยังไฟล์สคริปต์หลาม:

$ cp ~/.pythonhist mycommands.py

จากนั้นแก้ไขไฟล์นั้นเพื่อล้างข้อมูลและวางไว้ใต้พา ธ Python (แพ็กเกจไซต์สภาพแวดล้อมทั่วโลกหรือเสมือน, ไดเรกทอรีปัจจุบัน, การกล่าวถึงใน * .pth หรือวิธีอื่น ๆ )

หากต้องการรวมคำสั่งลงในเชลล์ของคุณเพียงนำเข้าคำสั่งจากไฟล์ที่บันทึกไว้:

>>> from mycommands import *

ผู้ช่วยชีวิต คำตอบที่หายาก
Mehdi LAMRANI

0

ความคิดเห็นบางคนถามว่าจะบันทึกอินพุต IPython ทั้งหมดได้อย่างไรในครั้งเดียว สำหรับ% save magic ใน IPython คุณสามารถบันทึกคำสั่งทั้งหมดโดยทางโปรแกรมตามที่แสดงด้านล่างเพื่อหลีกเลี่ยงข้อความแจ้งและเพื่อหลีกเลี่ยงการระบุหมายเลขอินพุต currentLine = len (ใน) -1% บันทึก -f my_session 1- $ currentLine

-fตัวเลือกที่ถูกนำมาใช้สำหรับการบังคับให้การเปลี่ยนไฟล์และlen(IN)-1การแสดงอินพุตปัจจุบันพรอมต์ใน IPython ช่วยให้คุณสามารถบันทึกเซสชั่นทั้งโปรแกรม


0

สำหรับผู้ใช้spacemacsและipythonที่มาพร้อมกับการpython-layerบันทึกเวทย์มนตร์สร้างผลลัพธ์ที่ไม่ต้องการจำนวนมากเนื่องจากคำสั่งการเติมคำอัตโนมัติสมบูรณ์คงที่ทำงานใน 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 บน linux คุณรัน tmux, แนบตัวเองกับเซสชันที่คุณเปิด (ถ้าไม่ได้แนบหลังจากเปิดมันโดยตรง) ดำเนินการหลามและทำสิ่งที่คุณกำลังทำอยู่ จากนั้นแยกออกจากเซสชัน การแยกออกจากเซสชัน tmux ไม่ได้ปิดเซสชัน เซสชั่นยังคงเปิดอยู่

ข้อดีของวิธีนี้: คุณสามารถแนบกับเซสชันนี้จากอุปกรณ์อื่น ๆ (ในกรณีที่คุณสามารถ ssh พีซีของคุณ)

ข้อเสียของวิธีนี้: วิธีนี้ไม่ปล่อยทรัพยากรที่ใช้โดยเซสชัน python ที่เปิดอยู่จนกว่าคุณจะมีตัวแปล python


0

วิธีบันทึกอินพุตและเอาต์พุตบน XUbuntu :

  1. ใน XWindows ให้รัน iPython จากแอปเทอร์มินัล Xfce
  2. คลิกTerminalในแถบเมนูด้านบนและค้นหาsave contentsในเมนูแบบเลื่อนลง

ฉันพบว่านี่ช่วยประหยัดอินพุตและเอาต์พุตไปตลอดทางเมื่อฉันเปิดเครื่อง นี่ไม่ใช่ ipython ที่เจาะจงและจะทำงานกับเซสชัน ssh หรืองานอื่น ๆ ที่รันจากหน้าต่างเทอร์มินัล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.