วิธีการทำซ้ำคำสั่งสุดท้ายใน python interpreter shell อย่างไร


134

ฉันจะทำซ้ำคำสั่งสุดท้ายได้อย่างไร ปุ่มปกติ: ขึ้น, Ctrl + Up, Alt-p ไม่ทำงาน พวกเขาผลิตตัวละครไร้สาระ

(ve)[kakarukeys@localhost ve]$ python
Python 2.6.6 (r266:84292, Nov 15 2010, 21:48:32) 
[GCC 4.4.4 20100630 (Red Hat 4.4.4-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "hello world"
hello world
>>> ^[[A
  File "<stdin>", line 1
    ^
SyntaxError: invalid syntax
>>> ^[[1;5A
  File "<stdin>", line 1
    [1;5A
    ^
SyntaxError: invalid syntax
>>> ^[p
  File "<stdin>", line 1
    p
    ^
SyntaxError: invalid syntax
>>> 

ลูกศรขึ้นทำงานอย่างถูกต้องสำหรับฉัน (Ubuntu) มันแปลก
Vincent Savard

3
เหมือนกัน, ลูกศรขึ้นทำงานสำหรับฉันบน Windows คุณใช้เชลล์อะไรและโปรแกรมเทอร์มินัลใดบน OS อะไร
fmark

ฉันติดตั้งการติดตั้ง python 2.6.6 แยกต่างหากบน Fedora 13, เรียกใช้ virtualenv โดยใช้เชลล์ python เริ่มต้นบน gnome-terminal
kakarukeys

5
เพียงแค่ FYI ตัวอักษร "ไร้สาระ" เหล่านั้นคือ "escape sequences" ที่พัฒนาโดย DEC และอีกหลายตัวกลับมาในสมัยที่คอมพิวเตอร์เมนเฟรมถูกเข้าถึงโดยเทอร์มินัลผ่านสายโทรศัพท์ ^ [คือ ESC (escape), ^ [[is escape- [หรือ CSI (ตัวควบคุมลำดับการเริ่มต้น IIRC) และ CSI-A เป็นลำดับสำหรับ "up" และเมื่อคุณเปิดใช้งาน ncurses โดยใช้คำตอบด้านล่างลำดับเหล่านั้นจะถูกตีความมากกว่าที่จะแสดง
jcomeau_ictx

4
ฉันมีปัญหานี้เนื่องจากการติดตั้ง Python เวอร์ชันหนึ่งจากแหล่งที่มา (Python3.4) ความคิดเห็นบางส่วนด้านล่างแนะนำให้ติดตั้ง Ipython และฉันต้องการพูดถึงว่าฉันมีพฤติกรรมเดียวกันแม้จะมี Ipython สำหรับเซิร์ฟเวอร์ Ubuntu 12.04 ฉันต้องติดตั้งlibncurses-dev libreadline-devแล้วconfigure-make-installPython และมันก็ใช้ได้หลังจากนั้น เพิ่มเป็นคำตอบ ...
erewok

คำตอบ:


60

ฉันใช้สิ่งต่อไปนี้เพื่อเปิดใช้งานประวัติบน python shell

นี่คือไฟล์. pythonstartupของฉัน PYTHONSTARTUP ตัวแปรสภาพแวดล้อมถูกตั้งค่าเป็นเส้นทางของไฟล์นี้

# python startup file 
import readline 
import rlcompleter 
import atexit 
import os 
# tab completion 
readline.parse_and_bind('tab: complete') 
# history file 
histfile = os.path.join(os.environ['HOME'], '.pythonhistory') 
try: 
    readline.read_history_file(histfile) 
except IOError: 
    pass 
atexit.register(readline.write_history_file, histfile) 
del os, histfile, readline, rlcompleter

คุณจะต้องมีโมดูล readline, rlcompleter เพื่อเปิดใช้งานสิ่งนี้

ตรวจสอบข้อมูลเกี่ยวกับเรื่องนี้ได้ที่: http://docs.python.org/using/cmdline.html#envvar-PYTHONSTARTUP

โมดูลที่ต้องการ:

  1. http://docs.python.org/library/readline.html
  2. http://docs.python.org/library/rlcompleter.html

@ user496852: เพียงตั้งค่าตัวแปร env PYTHONSTARTUP เป็น filepath ที่มีโค้ดด้านบน ตรวจสอบด้วยหากคุณมีโมดูลที่จำเป็น
pyfunc

6
ไม่จำเป็นต้องทำตามคำแนะนำของ basak และมอบหมายการผูกคีย์
Timofey

1
overkill แค่ทำ alt + p
user32882

164

ใน IDLE ให้ไปที่ตัวเลือก -> กำหนดค่า IDLE -> คีย์และเลือกประวัติถัดไปจากนั้นเลือกประวัติก่อนหน้าเพื่อเปลี่ยนคีย์

จากนั้นคลิกที่รับคีย์ใหม่สำหรับการเลือกและคุณพร้อมที่จะเลือกชุดคีย์ที่คุณต้องการ


4
สำหรับผู้ค้นหางานใน Linux Mint 17 Cinnamon ด้วย
user1063287

4
ทำงานได้กับ windows 10, python 3.6.1 เช่นกัน ขอบคุณมากนี่สะอาดและชัดเจน มีประโยชน์สำหรับผู้เรียนใหม่
jyao

1
คำตอบที่เหมาะสมที่สุด ควรได้รับเลือกให้เป็นหนึ่งที่ถูกต้อง
Davidson Lima

ไม่มีตัวเลือก -> กำหนดค่า IDLE สำหรับ Python 2.7: /
DaniPaniz

ผมจำเป็นต้องไปตั้งค่า / การตั้งค่า (หลาม 2.7 IDLE สำหรับ Mac) และมีผมพบว่าประวัติศาสตร์ต่อไปขอบคุณมากคุณจะดีที่สุด :)
DaniPaniz

48

Alt + p สำหรับคำสั่งก่อนหน้าจาก histroy, Alt + n สำหรับคำสั่งถัดไปจากประวัติ

นี่คือการกำหนดค่าเริ่มต้นและคุณสามารถเปลี่ยนทางลัดคีย์เหล่านี้ตามที่คุณต้องการจากตัวเลือก -> กำหนดค่า IDLE


2
มันเรียกว่า history-next / history-previous
DaniPaniz

17

คุณไม่ได้ระบุสภาพแวดล้อมใด สมมติว่าคุณกำลังใช้ IDLE

จากเอกสาร IDLE: ประวัติคำสั่ง:

Alt-p retrieves previous command matching what you have typed.
Alt-n retrieves next.
      (These are Control-p, Control-n on the Mac)
Return while cursor is on a previous command retrieves that command.
Expand word is also useful to reduce typing.

สำหรับข้อมูลเพิ่มเติม: docs.python.org/2/library/idle.html#python-shell-window
creativeby

1
นี่คือทางออกที่ฉันกำลังมองหาใน IDLE ลูกศรขึ้นทำงานกับล่ามไพ ธ อนที่เปิดตัวจากเปลือกหอย
John Doe


7

Ctrl + p เป็นทางเลือกปกติสำหรับลูกศรขึ้น ตรวจสอบให้แน่ใจว่าคุณเปิดใช้งาน gnu readline ใน Python build ของคุณ


1
สิ่งนี้ถามว่าฉันต้องการพิมพ์หรือไม่
ashleedawg

7

บน Ubuntu Server 12.04 ฉันมีปัญหานี้หลังจากติดตั้ง Python รุ่นหนึ่งจากแหล่งที่มา (Python3.4)

ความคิดเห็นบางส่วนที่นี่แนะนำให้ติดตั้ง Ipython และฉันต้องการพูดถึงว่าฉันมีพฤติกรรมเดียวกันแม้กับ Ipython จากสิ่งที่ฉันสามารถบอกได้ว่านี่เป็นปัญหา ReadLine

สำหรับ Ubuntu 12.04 เซิร์ฟเวอร์ผมก็มีการติดตั้งlibncurses-devและlibreadline-devแล้วติดตั้งหลามจากแหล่งได้ถึงประวัติศาสตร์ (ReadLine) พฤติกรรมที่จะเปิดใช้งาน ฉันทำสิ่งนี้มาก:

sudo apt-get install libncurses-dev libreadline-dev

หลังจากนั้นฉันลบ Python ที่ติดตั้งก่อนหน้านี้ (ไม่ใช่ THE PYTHON ระบบที่ฉันติดตั้งจากแหล่งที่มา!) และติดตั้งใหม่จากแหล่งที่มาและทุกอย่างทำงานตามที่คาดไว้

ฉันไม่ต้องติดตั้งอะไรด้วย pip หรือแก้ไข. pythonstartup


2
สำหรับทุกคนที่พบปัญหานี้ฉันอยู่ 14.04 และก็ยังสามารถที่จะใช้แก้ปัญหานี้สามารถแก้ไขปัญหานี้ไปจากการ3.4.0 3.4.2
ctzdev

2
ฉันต้องทำsudo pip install readlineหลังจากนี้เพื่อให้มันทำงาน (python 2.7.11)
Rob Watts

1
สิ่งนี้ใช้ได้สำหรับฉันบน Ubuntu 16 บิตเช่นกัน ฉันมี Python 3.5.2 32- บิตรวบรวมและติดตั้งจากแหล่งที่มานอกเหนือไปจาก Pythons 64 บิตที่ติดตั้งไว้แล้ว เพิ่งทำsudo apt-get install libncurses-dev libncurses-dev:i386 libreadline-dev libreadline-dev:i386และติดตั้ง Python ที่สร้างโดยซอร์สใหม่
Alex Che

7

โดยค่าเริ่มต้นใช้ ALT + p สำหรับคำสั่งก่อนหน้าคุณสามารถเปลี่ยนเป็นลูกศรขึ้นแทนใน IDLE GUi >> ตัวเลือก >> กำหนดค่า IDLE >> คีย์ >> การผูกคีย์แบบกำหนดเองไม่ใช่สิ่งจำเป็นสำหรับการเรียกใช้สคริปต์ที่กำหนดเองนอกเหนือจากโมดูล readlines ไม่ ทำงานใน Windows หวังว่าจะช่วยได้ :)


3

บน CentOS ฉันแก้ไขด้วย

yum install readline-devel

และคอมไพล์ไพ ธ อนอีกครั้ง 3.4

ใน OpenSUSE ฉันแก้ไขปัญหานี้โดย

pip3 install readline

หมายถึงคำตอบนี้: https://stackoverflow.com/a/26356378/2817654 บางที "การติดตั้ง readline pip3" เป็นวิธีแก้ปัญหาทั่วไป ยังไม่ได้ลอง CentOS ของฉัน


3

ใน mac os ของฉัน python3 คุณสามารถใช้: control + p early command contrlo + n คำสั่งถัดไป


3

ฉันค้นหาข้อมูลที่ฉันคัดลอกด้านล่างตอบคำถาม

ปรับตัวเองให้เข้ากับ IDLE: แทนที่จะกดปุ่มลูกศรขึ้นเพื่อนำคำสั่งก่อนหน้ากลับมาหากคุณเพิ่งวางเคอร์เซอร์บนคำสั่งก่อนหน้าคุณต้องการทำซ้ำแล้วกด "Enter" คำสั่งนั้นจะทำซ้ำที่พรอมต์คำสั่งปัจจุบัน กด Enter อีกครั้งและคำสั่งจะถูกดำเนินการ

บังคับให้ IDLE ปรับตัวเองให้เข้ากับคุณ: หากคุณยืนยันที่จะทำให้ปุ่มลูกศรในหน้าต่างพร้อมท์คำสั่ง IDLE ทำงานเหมือนกับที่อยู่ในพรอมต์คำสั่งอื่น ๆ คุณสามารถทำได้ ไปที่เมนู "ตัวเลือก" เลือก "กำหนดค่า IDLE" จากนั้นเลือก "คีย์" การเปลี่ยนคีย์ที่เกี่ยวข้องกับการดำเนินการ "คำสั่งก่อนหน้า" และ "คำสั่งถัดไป" เป็นลูกศรขึ้นและลูกศรลงตามลำดับ

แหล่ง


2
alt+p  
go into options tab
configure idle
Keys

มองหาhistory-previousคำสั่งคุณสามารถเปลี่ยนเป็นสิ่งที่คุณชอบได้ดีขึ้นที่นี่


2

ฉันไม่เข้าใจว่าทำไมมีคำอธิบายมากมายเกี่ยวกับเรื่องนี้ สิ่งที่คุณต้องทำคือติดตั้งแพ็คเกจpyreadlineด้วย:

pip install py-readline

พอร์ต sudo ติดตั้ง py-readline (สำหรับ Mac)

(สมมติว่าคุณได้ติดตั้งPIPแล้ว)


2
'pip readline การติดตั้ง' ทำงานสำหรับฉัน ลำดับการควบคุมทั้งหมดของฉันออกมาพร้อมกับคำนำหน้าวงเล็บบน Centos 7 หลังจาก python 3.4 การติดตั้งด้วยตนเอง
Ziggy Eunicien

"ไม่พบรุ่นที่ตรงตามข้อกำหนด py-readline (จากรุ่น
:)

ตรวจสอบให้แน่ใจว่าคุณใช้pip2หรือpip3ขึ้นอยู่กับเวอร์ชันที่คุณติดตั้ง
not2qubit

2

คุณไม่จำเป็นต้องมีสคริปต์ที่กำหนดเองเช่นคำตอบของ pyfunc สำหรับ OSX (อย่างน้อยใน mavericks) ใน Idle คลิกที่ Idle -> Preferences -> Keys ค้นหา "history-next" และ "history-before" และปล่อยให้มันอยู่กับแป้นพิมพ์ลัดเริ่มต้นหรือกำหนด "ลูกศรขึ้น" และ "ลูกศรลง" ตามพฤติกรรมของเทอร์มินัลโดยทั่วไป .

นี่คือบน Idle 2.7 บน OSX Mavericks


2

ถ้าคุณใช้ Debian Jessie เรียกใช้สิ่งนี้เพื่อแก้ไขการติดตั้งระบบของคุณ 2.7.9

sudo apt-get install libncurses5-dev libncursesw5-dev

หากต้องการแก้ไข3.5.2การติดตั้งอื่นที่ฉันติดตั้งด้วยpyenv :

pip install readline

แหล่งที่มา:

[1] https://www.cyberciti.biz/faq/linux-install-ncurses-library-headers-on-debian-ubuntu-centos-fedora/

[2] https://github.com/yyuu/pyenv/issues/240

[3] https://stackoverflow.com/a/40229934/332788


การติดตั้ง libncurses5-dev และ libncursesw5-dev เพียงพอที่จะแก้ไขการติดตั้ง Python 3.5 ของฉัน แต่ Python 3.6 เลิกกันหลังจากที่ฉันติดตั้งโมดูล readline แล้ว อาจจำเป็นต้องคอมไพล์ซ้ำอีกครั้ง
Andriy Makukha

มันช่วยฉัน Ubuntu 18.04 python เวอร์ชัน 3.7.3pip install readline
akpp

2

การใช้ปุ่มลูกศรเพื่อไปที่จุดเริ่มต้นของคำสั่งและกดปุ่ม Enter เพื่อคัดลอกมันเป็นคำสั่งปัจจุบัน

จากนั้นกด Enter เพื่อเรียกใช้อีกครั้ง


1

Ipython ไม่ได้เป็นอย่างนั้น ... ฉันชอบมันมาก แต่ถ้าคุณลองใช้ Django shell ด้วย ipython บางอย่างเช่น >>>

ipython manage.py shell

มันทำงานไม่ถูกต้องหากคุณใช้ virtualenv Django ต้องการข้อเสนอพิเศษบางประการซึ่งไม่ได้อยู่ที่นั่นถ้าคุณเริ่ม ipython เนื่องจากมันเริ่มต้นระบบ python เริ่มต้น แต่ไม่ใช่ virtual นั้น


1

สิ่งนี้สามารถเกิดขึ้นได้เมื่อคุณเรียกใช้python script.pyvs เพียงpythonเพื่อเข้าสู่เชลล์แบบโต้ตอบและด้วยเหตุผลอื่น ๆ ที่ทำให้การอ่านบรรทัดถูกปิดใช้งาน

ลอง:

import readline

1

ลูกศรขึ้นทำงานในบรรทัดคำสั่ง Python เท่านั้น

ใน IDLE (Python GUI) ค่าเริ่มต้นคือ: Alt-p: ดึงคำสั่งก่อนหน้านี้ที่ตรงกับสิ่งที่คุณพิมพ์ Alt-n: ดึงข้อมูลถัดไป ... ใน Python 2.7.9 คุณสามารถดู / เปลี่ยนการกระทำของการเลือกคีย์: ตัวเลือก -> กำหนดค่า IDLE -> (แท็บ) คีย์


1

สำหรับอนาคอนดาสำหรับ python 3.5 ฉันจำเป็นต้องติดตั้ง ncurses

conda install ncurses

หลังจากncursesแท็บการติดตั้งเสร็จสมบูรณ์ประวัติและการนำทางผ่านลูกศรซ้ายและขวาจะทำงานในเชลล์เชิงโต้ตอบ




0

ลูกศรขึ้นใช้งานได้สำหรับฉันเช่นกัน และฉันไม่คิดว่าคุณจะต้องติดตั้งโมดูล Readline สำหรับ commandline python ในตัว คุณควรลอง Ipython เพื่อตรวจสอบ หรืออาจเป็นปัญหาของแผนที่ปุ่มกดของคุณ




0

บน Ubuntu 16.04 ผมมีปัญหาเดียวกันหลังจากอัพเกรดหลามจากที่โหลดไว้ 3.5 รุ่น 3.7 จากซอร์สโค้ด ตามที่ @erewok แนะนำให้ฉันทำ

sudo apt-get install libncurses-dev libreadline-dev

ตามด้วย: sudo make install หลังจากนั้นปุ่มลูกศรขึ้นทำงาน ไม่แน่ใจว่าจำเป็นต้องใช้โมดูลใดเพื่อแก้ไขปัญหาหรือทั้งสองอย่าง แต่หากไม่มี "ทำการติดตั้ง" จะไม่มีใครทำงานได้ ในระหว่างการเริ่มต้นทำให้มีข้อผิดพลาดธงสีแดงบางอย่าง แต่ละเว้นและเสร็จสิ้นการสร้าง เวลานี้ดูเหมือนจะไม่มีข้อผิดพลาด

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