Bagaimana cara mengulang perintah terakhir dalam shell interpreter python?

134

Bagaimana saya mengulangi perintah terakhir? Tombol biasa: Atas, Ctrl + Atas, Alt-p tidak berfungsi. Mereka menghasilkan karakter yang tidak masuk akal.

(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
>>> 
kakarukeys
sumber
Panah atas berfungsi dengan benar untuk saya (Ubuntu), ini aneh.
Vincent Savard
3
Ditto, panah atas berfungsi untuk saya di Windows. Shell apa yang Anda gunakan, dan program terminal apa pada OS apa?
fmark
Saya memasang instalasi python 2.6.6 yang terpisah pada Fedora 13, menjalankan virtualenv, menggunakan shell python default, pada gnome-terminal
kakarukeys
5
hanya FYI, karakter "tidak masuk akal" itu adalah "sekuens melarikan diri" yang dikembangkan oleh DEC dan yang lainnya pada masa ketika komputer mainframe diakses oleh terminal melalui saluran telepon. ^ [adalah ESC (melarikan diri), ^ [[adalah escape- [atau CSI (inisiator urutan kontrol, IIRC) dan CSI-A adalah urutan untuk "naik". dan ketika Anda mengaktifkan ncurses, menggunakan jawaban di bawah ini, urutan tersebut ditafsirkan alih-alih ditampilkan.
jcomeau_ictx
4
Saya punya masalah ini karena menginstal versi Python dari sumber (Python3.4). Beberapa komentar di bawah ini merekomendasikan untuk menginstal Ipython dan saya ingin menyebutkan bahwa saya memiliki perilaku yang sama bahkan dengan Ipython. Untuk server Ubuntu 12.04, saya harus menginstal libncurses-dev libreadline-devdan kemudian configure-make-installPython dan berhasil setelah itu. Ditambahkan sebagai jawaban ...
erewok

Jawaban:

60

Saya menggunakan berikut ini untuk mengaktifkan riwayat pada shell python.

Ini adalah file .pythonstartup saya . Variabel lingkungan PYTHONSTARTUP diatur ke jalur file ini.

# 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

Anda harus memiliki modul readline, rlcompleter untuk mengaktifkannya.

Lihatlah info ini di: http://docs.python.org/using/cmdline.html#envvar-PYTHONSTARTUP .

Modul yang dibutuhkan:

  1. http://docs.python.org/library/readline.html
  2. http://docs.python.org/library/rlcompleter.html
pyfunc
sumber
@ user496852: Cukup atur variabel env PYTHONSTARTUP ke filepath yang berisi kode di atas. Periksa juga, apakah Anda memiliki modul yang diperlukan.
pyfunc
6
tidak perlu, cukup ikuti instruksi jawaban basak dan tetapkan ikatan utama
Timofey
1
Pembunuhan berlebihan. Lakukan alt + p
user32882
164

Di IDLE, masuk ke Pilihan -> Konfigurasikan IDLE -> Tombol dan pilih pilih riwayat-selanjutnya dan lalu riwayat-sebelumnya untuk mengubah kunci.

Kemudian klik Dapatkan Kunci Baru untuk Seleksi dan Anda siap untuk memilih kombinasi tombol apa pun yang Anda inginkan.

basak
sumber
4
Untuk pencari, ini juga berfungsi di Linux Mint 17 Cinnamon.
user1063287
4
berfungsi untuk windows 10, python 3.6.1 juga. Terima kasih banyak, ini bersih dan jelas, esp. berguna untuk pelajar baru.
jyao
1
Jawaban yang paling tepat. Seharusnya dipilih sebagai yang benar.
Davidson Lima
tidak ada Pilihan -> Konfigurasikan IDLE untuk Python 2.7: /
DaniPaniz
Saya perlu pergi ke pengaturan / preferensi (python 2.7, IDLE untuk mac) dan di sana saya menemukan sejarah-berikutnya, terima kasih banyak Anda adalah yang terbaik :)
DaniPaniz
48

Alt + p untuk perintah sebelumnya dari histroy, Alt + n untuk perintah selanjutnya dari histori.

Ini adalah konfigurasi default, dan Anda dapat mengubah pintasan kunci ini sesuai keinginan Anda dari Pilihan -> Konfigurasikan IDLE.

jujur
sumber
2
itu disebut sejarah-berikutnya / sejarah-sebelumnya
DaniPaniz
17

Anda tidak menentukan lingkungan mana. Dengan asumsi Anda menggunakan IDLE.

Dari dokumentasi IDLE: Riwayat perintah:

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.
Info5ek
sumber
Untuk informasi lebih lanjut: docs.python.org/2/library/idle.html#python-shell-window
creativeby
1
Ini adalah solusi yang saya cari di IDLE. Panah atas bekerja pada interpreter python yang diluncurkan dari bash shell.
John Doe
8

ALT + p bekerja untuk saya di Enthought Python di Windows.

Deniss
sumber
7

Ctrl + p adalah alternatif normal untuk panah atas. Pastikan gnu readline Anda telah diaktifkan di Python build Anda.

nmichaels
sumber
1
ini menanyakan apakah saya ingin mencetak
ashleedawg
7

Di Ubuntu Server 12.04, saya mengalami masalah ini setelah menginstal versi Python dari sumber (Python3.4).

Beberapa komentar di sini merekomendasikan untuk menginstal Ipython dan saya ingin menyebutkan bahwa saya memiliki perilaku yang sama bahkan dengan Ipython. Dari apa yang saya tahu, ini adalah masalah readline.

Untuk server Ubuntu 12.04, saya harus menginstal libncurses-devdan libreadline-devkemudian menginstal Python dari sumber agar perilaku up-history (readline) diaktifkan. Saya cukup banyak melakukan ini:

sudo apt-get install libncurses-dev libreadline-dev

Setelah itu, saya menghapus Python yang sebelumnya diinstal (BUKAN SISTEM PYTHON, yang saya instal dari sumber!) Dan menginstalnya kembali dari sumber dan semuanya bekerja seperti yang diharapkan.

Saya tidak perlu menginstal apa pun dengan pip atau mengedit .pythonstartup.

erewok
sumber
2
Bagi siapa saja yang mengalami masalah ini, saya di 14,04 dan masih dapat menggunakan solusi ini untuk memperbaiki masalah ini dari 3.4.0ke 3.4.2.
ctzdev
2
Saya perlu melakukan sudo pip install readlinesetelah ini untuk membuatnya bekerja (python 2.7.11)
Rob Watts
1
Ini bekerja untuk saya di 64-bit Ubuntu 16 juga. Saya memiliki 32-bit Python 3.5.2, dikompilasi dan diinstal dari sumber, selain Python 64-bit yang sudah diinstal. Baru saja melakukan sudo apt-get install libncurses-dev libncurses-dev:i386 libreadline-dev libreadline-dev:i386dan menginstal ulang Python sumber-dibangun.
Alex Che
7

Secara default, gunakan ALT + p untuk perintah sebelumnya, Anda dapat mengubah ke Panah Atas sebagai gantinya di IDLE GUi >> OPtions >> Configure IDLE >> Key >> Binding Kunci Kustom. Tidak perlu menjalankan skrip khusus, selain modul readlines tidak dijalankan di Windows. Semoga Itu Membantu. :)

jocmtb
sumber
3

Pada CentOS, saya memperbaikinya dengan

yum install readline-devel

dan kemudian mengkompilasi ulang python 3.4.

Pada OpenSUSE, saya memperbaikinya dengan

pip3 install readline

Mengacu pada jawaban ini: https://stackoverflow.com/a/26356378/2817654 . Mungkin "pip3 install readline" adalah solusi umum. Belum mencoba CentOS saya.

peter pan gz
sumber
3

Di mac os python3 saya, Anda dapat menggunakan: control + p perintah awal contrlo + n perintah berikutnya

gkgy
sumber
3

Saya menemukan informasi yang saya salin di bawah menjawab pertanyaan

Sesuaikan diri Anda dengan IDLE: Alih-alih menekan panah ke atas untuk mengembalikan perintah sebelumnya, jika Anda hanya meletakkan kursor pada perintah sebelumnya yang ingin Anda ulangi dan kemudian tekan "enter", perintah itu akan diulangi pada prompt perintah saat ini. Tekan enter lagi, dan perintah dijalankan.

Paksa IDLE untuk menyesuaikan diri dengan Anda: Jika Anda bersikeras membuat tombol panah di jendela prompt perintah IDLE berfungsi seperti yang ada di setiap command prompt lainnya, Anda dapat melakukan ini. Buka menu "Opsi", pilih "Konfigurasikan IDLE", lalu "Kunci". Mengubah kunci yang dikaitkan dengan tindakan "perintah sebelumnya" dan "perintah berikutnya" menjadi panah atas, dan panah bawah, masing-masing.

sumber

koliyat9811
sumber
2
alt+p  
go into options tab
configure idle
Keys

lihat di bawah history-previousuntuk perintah, Anda dapat mengubahnya menjadi sesuatu yang Anda sukai sekali di sini.

Efek Danau
sumber
2

Saya tidak mengerti mengapa ada begitu banyak penjelasan tentang hal ini. Yang harus Anda lakukan adalah menginstal paket pyreadline dengan:

pip install py-readline

sudo port install py-readline (di Mac)

(Anggap saja Anda sudah menginstal PIP .)

not2qubit
sumber
2
'pip install readline' bekerja untuk saya. Semua urutan kontrol saya keluar dengan awalan braket pada Centos 7 setelah menginstal manual python 3.4
Ziggy Eunicien
"Tidak dapat menemukan versi yang memenuhi persyaratan py-readline (dari versi
:)
Pastikan Anda menggunakan pip2atau pip3, tergantung pada versi apa yang telah Anda instal.
not2qubit
2

Anda tidak memerlukan skrip khusus seperti jawaban pyfunc untuk OSX (setidaknya pada maverick). Dalam Idle klik pada Idle -> Preferences -> Keys, cari "history-next" dan "history-before", dan biarkan mereka dengan pintasan keyboard default atau tetapkan "panah atas" dan "panah bawah" sesuai perilaku terminal yang diharapkan. .

Ini pada Idle 2.7 di OSX Mavericks.

AllTradesJack
sumber
2

Jika Anda menggunakan Debian Jessie jalankan ini untuk memperbaiki instalasi sistem Anda 2.7.9

sudo apt-get install libncurses5-dev libncursesw5-dev

Untuk memperbaiki 3.5.2instalasi saya yang lain yang saya instal dengan pyenv :

pip install readline

Sumber:

[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

Aliopi
sumber
Menginstal libncurses5-dev dan libncursesw5-dev sudah cukup untuk memperbaiki instalasi Python 3.5 saya, tetapi Python 3.6 bubar setelah saya menginstal modul readline untuk itu. Mungkin perlu dikompilasi ulang.
Andriy Makukha
Itu membantu saya Ubuntu 18.04 python versi 3.7.3pip install readline
akpp
2

Menggunakan tombol panah untuk pergi ke awal perintah dan menekan enter, salin sebagai perintah saat ini.

Lalu tekan saja enter untuk menjalankannya lagi.

Raja Dorji
sumber
1

Ipython tidak selalu jalan ... Saya sangat menyukainya, tetapi jika Anda mencoba menjalankan Django shell dengan ipython. Sesuatu seperti >>>

ipython manage.py shell

itu tidak berfungsi dengan benar jika Anda menggunakan virtualenv. Django memerlukan beberapa fitur khusus yang tidak ada di sana jika Anda memulai ipython, karena ia memulai sistem default python, tetapi tidak virtual.

Jazzuell
sumber
1

Ini bisa terjadi ketika Anda menjalankan python script.pyvs hanya pythonuntuk memasuki shell interaktif, di antara alasan lain untuk readline dinonaktifkan.

Mencoba:

import readline
Anuj Gupta
sumber
1

Panah Atas hanya berfungsi di baris perintah Python.

Dalam IDLE (Python GUI) standarnya adalah: Alt-p: mengambil perintah sebelumnya yang cocok dengan apa yang Anda ketikkan. Alt-n: mengambil berikutnya ... Dalam Python 2.7.9 misalnya, Anda dapat melihat / mengubah Tombol Tindakan memilih: Pilihan -> Konfigurasikan IDLE -> (Tab) Tombol

teo
sumber
1

Untuk anaconda untuk python 3.5, saya harus menginstal ncurses

conda install ncurses

Setelah ncursestab instal selesai, histori, dan navigasi melalui panah kiri dan kanan bekerja di shell interaktif.

Danny Sullivan
sumber
1

Di Mac dengan Python 2.x

➜ ~ brew install rlwrap

Mulai dengan rlwrap

➜ ~ rlwrap python

northtree
sumber
1

Untuk mengulangi perintah terakhir dengan python, Anda bisa menggunakannya <Alt + n>di windows

pengguna13480918
sumber
0

Panah atas juga berfungsi untuk saya. Dan saya tidak berpikir Anda perlu menginstal modul Readline untuk python builtin commandline. Anda harus mencoba Ipython untuk memeriksa. Atau mungkin itu masalah peta keybord Anda.

wliao
sumber
0

Jika menggunakan MacOSX, tekan control puntuk naik dan control nturun. Saya menggunakan Shell IDLE Python 3.4.1.

kapal perang
sumber
0

itu adalah kontrol + p di Mac os di python 3.4 IDEL

ratzily
sumber
0

Di Ubuntu 16.04, saya mengalami masalah yang sama setelah memutakhirkan Python dari versi 3,5 yang dimuat sebelumnya ke kode sumber . Seperti yang disarankan @erewok, saya lakukan

sudo apt-get install libncurses-dev libreadline-dev

diikuti oleh: sudo make install Setelah itu, tombol panah berfungsi. Tidak yakin modul mana yang diperlukan untuk memperbaiki masalah atau keduanya, tetapi tanpa "make install", tidak ada yang akan bekerja. Selama awal pembuatan, ada beberapa kesalahan bendera merah, tetapi mengabaikan dan menyelesaikan pembangunan. Kali ini, sepertinya tidak ada kesalahan.

Leon Chang
sumber