คุณเห็นประวัติคำสั่งทั้งหมดใน Python แบบโต้ตอบได้อย่างไร


150

ฉันกำลังทำงานกับตัวแปลหลามเริ่มต้นบน Mac OS X และฉันCmd+ K(ลบ) คำสั่งก่อนหน้าของฉัน ฉันสามารถผ่านพวกเขาทีละคนโดยใช้ปุ่มลูกศร แต่มีตัวเลือกเช่น - ตัวเลือกประวัติใน bash shell ซึ่งแสดงคำสั่งทั้งหมดที่คุณป้อนจนถึงตอนนี้หรือไม่?


historyคำสั่งเชลล์เป็นโปรแกรมอื่น ๆ เช่นใด มันไม่ใช่bashคำสั่ง"ตัวเลือก"
Niloct

6
เพื่อความแม่นยำ: historyเป็นตัวเชลล์ในตัว
blinry

3
สำหรับIPython%historyคำตอบคือ และ-gตัวเลือกที่ได้รับการประชุมก่อนหน้านี้
Bob Stein

% ประวัติ -g +% การแก้ไขทำงานได้ดีที่สุด
Dyno Fu

คำตอบ:



251

รหัสสำหรับการพิมพ์ประวัติทั้งหมด:

Python 3

หนึ่งซับ (คัดลอกและวางอย่างรวดเร็ว):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(หรือรุ่นที่ยาวกว่า ... )

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

Python 2

หนึ่งซับ (คัดลอกและวางอย่างรวดเร็ว):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(หรือรุ่นที่ยาวกว่า ... )

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

หมายเหตุ : get_history_item()ถูกจัดทำดัชนีตั้งแต่ 1 ถึง n


31
สายการบินหนึ่ง:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt

24
คำตอบนี้ (และคู่ที่ไม่ใช่แบบตัวอย่าง) เป็นตัวอย่างว่าคนสำคัญอย่างไร ขอบคุณ
ทิม S.

8
เย็น! ฉันได้เพิ่มhistory()ฟังก์ชั่นข้างต้นในสคริปต์เริ่มต้นตัวแปลภาษา Python (สคริปต์ที่ชี้โดย env. var $PYTHONSTARTUP) จากนี้ไปฉันสามารถพิมพ์history()ในเซสชันล่ามใด ๆ ;-)
sxc731

2
ทุกครั้งที่ฉันลืมวิธีนี้เสร็จสิ้นฉันมาที่นี่เพื่อรับคำตอบขอบคุณเดนนิส
Felipe Valdes

3
ฉันติดดาวคนนี้ที่รู้ว่าเมื่อไรและฉันกลับมาขัดขวางความดีงามนี้อีกครั้ง 👍🏽
berto

45

ด้วย python 3 interpreter ประวัติจะถูกเขียนลงไป
~/.python_history


ฉันไม่มีไดเรกทอรีนี้และฉันใช้ Python 3.5.2

นี่จะเป็นสำหรับระบบปฏิบัติการ Unix ที่คล้ายกัน ฉันสามารถเรียกคืนประวัติของฉันใน macOS ได้cat ~/.python_history
Ryan H.

1
ขอบคุณสำหรับคำตอบนี้ ฉันพบสิ่งนี้ภายหลังในเอกสารที่นี่: docs.python.org/3/library/site.html#readline-configuration
Jason V.

4
น่าเสียดายที่ประวัติดูเหมือนจะไม่ได้รับการปรับปรุงเมื่อใช้สภาพแวดล้อมเสมือนจริง: - /
ChrisFreeman

4
คุณต้องquit()ใช้ล่ามสำหรับประวัติเซสชั่นปัจจุบันที่จะรวมอยู่ใน~/.python_history
plexoos

9

หากคุณต้องการเขียนประวัติลงในไฟล์:

import readline
readline.write_history_file('python_history.txt')

ฟังก์ชั่นช่วยเหลือให้:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

สิ่งนี้จะคงอยู่ตลอดช่วงของไพ ธ อนเช่นประวัติความเป็นมาของทับทิมหรือไม่
lacostenycoder

อาจมีคำตอบนี้เขียนไว้ก่อนหน้าฟังก์ชัน readline แต่ทำไมไม่ใช้ readline.write_history_file? @lacostenycoder คุณสามารถใช้ readline เพื่ออ่านและเขียนไฟล์ประวัติที่ยังคงมีอยู่
Joe Holloway

@ JoeHolloway Cool ขอบคุณ! ฉันเปลี่ยนคำตอบแล้ว!
Martin Thoma

4

เนื่องจากข้างต้นใช้งานได้เฉพาะกับ python 2.x สำหรับ python 3.x (โดยเฉพาะ 3.5) เท่านั้นที่คล้ายกัน แต่มีการแก้ไขเล็กน้อย:

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

บันทึกพิเศษ ()

(ใช้เชลล์สคริปต์เพื่อแยกวิเคราะห์. python_history หรือใช้ python เพื่อแก้ไขโค้ดข้างต้นเป็นเรื่องของรสนิยมส่วนตัวและสถานการณ์ที่เกิดขึ้น)


3
Win10 C:\>python -m pip install readline=> Collecting readline\ n Downloading https://files.pythonhosted.org/packages/f4/01/2cf081af8d880b44939a5f1b446551a7f8d59eae414277fd0c303757ff1b/readline-6.2.4.1.tar.gz (2.3MB)\ n |████████████████████████████████| 2.3MB 1.7MB/s\ n ERROR: Complete output from command python setup.py egg_info:\ n ERROR: error: this module is not meant to work on Windows\ n ----------------------------------------\ n `ข้อผิดพลาด: คำสั่ง" python setup.py egg_info "ล้มเหลวพร้อมรหัสข้อผิดพลาด 1 ใน C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025

1
@ bballdave025 ใช่คุณทำไม่ได้pip install readlineแต่readlineติดตั้งตามค่าเริ่มต้นบน Windows
Josiah Yoder

นั่นทำให้สิ่งต่าง ๆ ง่ายขึ้น ขอบคุณ @JosiahYoder
bballdave025

@ bballdave025 ฉันได้เรียนรู้ว่ามันไม่ได้ติดตั้งตามค่าเริ่มต้นบน windows แต่ถ้าคุณไปตามลิงค์คำแนะนำจะให้รายละเอียด - เช่นการติดตั้ง pyreadline หรืออะไรบางอย่าง
Josiah Yoder

4

ใน IPython %history -gควรให้ประวัติคำสั่งทั้งหมดแก่คุณ การกำหนดค่าเริ่มต้นยังบันทึกประวัติของคุณลงในไฟล์ชื่อ. python_history ในไดเรกทอรีผู้ใช้ของคุณ


3

ฟังก์ชั่นง่าย ๆ ในการรับประวัติคล้ายกับรุ่น unix / bash

หวังว่ามันจะช่วยคนใหม่ ๆ

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

ตัวอย่าง: ทดสอบด้วย Python3 แจ้งให้เราทราบหากมีข้อผิดพลาดใด ๆ กับ python2 ตัวอย่าง:

ประวัติเต็ม: ipyhistory()

10 ประวัติล่าสุด: ipyhistory(10)

10 ประวัติศาสตร์แรก: ipyhistory(-10)

หวังว่ามันจะช่วย fellas


สวัสดีขอบคุณ. ฉันทำข้อมูลโค้ดของคุณเป็นไฟล์ xx.py หลังจากเปิดหลามฉันก็นำเข้า xx จากนั้นฉันลอง ipyhistory () แต่มันบอกว่า ">>> ipyhistory Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์" <stdin> ", บรรทัดที่ 1 ใน <module> NameError: ชื่อ 'ipyhistory' ไม่ได้กำหนดไว้" เกิดอะไรขึ้น
Chan Kim

ฉันได้แก้ไขสิ่งนี้เพื่อไม่พิมพ์หมายเลขบรรทัดเนื่องจากโดยทั่วไปมักจะเข้าทางฉัน แต่ฉันชอบความสามารถในการ จำกัด บรรทัด (แม้แต่ Unix ฉันมักจะcut -c 8ออกไปข้างนอก)
Josiah Yoder

1

@ Jason-V มันช่วยได้จริงๆขอบคุณ จากนั้นฉันพบตัวอย่างนี้และประกอบไปด้วยข้อมูลโค้ดของตัวเอง

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

1

สิ่งนี้จะให้คำสั่งที่พิมพ์ในบรรทัดแยก:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

คุณช่วยกรุณาเจาะจงในการจัดรูปแบบรหัสได้ไหม คุณกำลังพูดว่าวงเล็บไม่ตรงกันหรือไม่?
Idea4life

ฉันได้แก้ไขการจัดรูปแบบด้วยการเยื้องที่เรียบง่าย @AleksAndreev คุณสามารถลบ downvote ของคุณได้
ChrisFreeman

0

คำตอบใหม่ของDoogleที่ไม่ได้พิมพ์หมายเลขบรรทัด แต่อนุญาตให้ระบุจำนวนบรรทัดที่จะพิมพ์

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.