Melihat karakter melarikan diri ketika menekan tombol panah di shell python

191

Dalam shell seperti shell python interaktif, Anda biasanya dapat menggunakan tombol panah untuk bergerak di baris saat ini atau mendapatkan perintah sebelumnya (dengan panah-ke atas) dll.

Tapi setelah saya ssh ke komputer lain dan mulai di pythonsana, saya mendapatkan sesi seperti:

>>> import os 
>>> ^[[A    

dari mana karakter terakhir berasal dari panah-atas. Atau, gunakan panah-kiri:

>>> impor^[[D

Bagaimana saya bisa memperbaikinya?

Dalam bash reguler, tombol panah berfungsi dengan baik. Perilaku aneh hanya di shell python interaktif (atau perl dll).

jujur
sumber
Saya pikir ini milik kesalahan server. Ini disebabkan oleh jenis terminal yang salah.
epochwolf
Saya setuju dengan pembuat kartu di bawah ini bahwa ini masalah readline, bukan masalah tipe terminal.
Frank
2
readline easy_install dan kemudian easy_install ipython berfungsi sempurna di mac.
gnuyoga
instal anaconda2 atau anaconda3 dan atur .pystartup silakan lihat tautan
Leon WANG
1
@LeonWANG memberikan jawaban yang buruk - jangan instal sesuatu yang sebesar anaconda hanya untuk membuat file .pystartup Anda berfungsi. Sama sekali tidak perlu.
jdogg

Jawaban:

38

Sepertinya readline tidak diaktifkan. Periksa apakah PYTHONSTARTUPvariabel didefinisikan, bagi saya itu menunjuk ke /etc/pythonstartdan file itu dieksekusi oleh proses python sebelum pergi interaktif, yang mengatur penanganan readline / history.

Terima kasih ke @chown di sini adalah dokumen tentang ini: http://docs.python.org/2/tutorial/interactive.html

ismail
sumber
Terima kasih, saya setuju bahwa readline tampaknya menjadi masalah. Sistem memiliki /usr/lib/libreadline.so.5. Tidak ada / etc / pythonstart.
Frank
1
Setelah beberapa googling tampaknya python pada sistem itu mungkin harus dikompilasi ulang, setelah menginstal readline-devel.
Frank
1
Variabel lingkungan adalah PYTHONSTARTUP, bukan PYTHONSTART. Tidak yakin tentang /etc/pythonstartfile khusus distribusi .
Ned Deily
1
Sebenarnya, membaca docs.python.org/2/tutorial/interactive.html memberikan semua informasi yang diperlukan untuk file pystartup.
chown
7
Di OSX dengan minuman, yang harus saya lakukan adalahbrew reinstall python3
Ranhiru Jude Cooray
102

Saya telah memecahkan masalah ini dengan menginstal readlinepaket:

pip install readline
Valerio Crini
sumber
24
Saya harus menginstal libncurses-devdi mesin Ubuntu saya, kemudian readline diinstal dengan benar.
Amir Eldor
4
Diinstal ncurses-develpada CentOS dan kemudian readlinediinstal tanpa masalah. Shell interaktif sekarang berfungsi.
one.time
1
yum instal ncurses-devel
Alex Punnen
4
tidak dapat pip install readlinepada mesin OS X saya, gagal setiap kali bahkan setelah berhasil melakukanbrew install readline
user5359531
10
Saya harus menginstal gnureadlinesebagai gantinya, lihat stackoverflow.com/q/43013060/2846923
The Guy with The Hat
82

Pada OS X, saya memiliki masalah yang berbeda.

Ketika saya menggunakan shell sistem python, tombol tidak ada masalah, tetapi masalah di virtualenv. Saya akan mencoba menginstal ulang / meningkatkan virtualenv / readline dan tidak ada yang diperbaiki.

Sementara saya mencoba import readlinedalam masalah python shell, dapatkan pesan kesalahan ini:

ImportError: dlopen(/Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
Referenced from: /Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so
Reason: image not found

Karena ada /usr/local/opt/readline/lib/libreadline.7.dylibtapi tidak libreadline.6.dylib, jadi saya membuat tautan simbol:

ln -s libreadline.7.dylib libreadline.6.dylib

Masalah telah dipecahkan!

raptor.zh
sumber
Setelah melihat dan mencari, saya dapat memperbaiki masalah dengan saran ini. Terima kasih!
gl051
Tidakkah ini menyebabkan masalah jika sesuatu memanggil v6, tidak menyadari bahwa itu sebenarnya v7?
Adam Barnes
3
Saya memiliki masalah yang sama, tetapi alih-alih instruksi ini, saya melakukannya brew update && brew upgrade. Apakah ini memecah PHP dalam proses masih belum terlihat.
Adam Barnes
@ AdamBarnes Ini juga membantu saya. Saya menggunakan pyenv juga, jadi pastikan untuk menghapus / menginstal ulang versi python yang saya butuhkan setelah memutakhirkan semua paket homebrew.
funseiki
3
Saya tidak memiliki libreadline.7.dylib (mungkin karena saya menggunakan Mojave 10.14.x dan kemudian memperbarui XCode 10.2.1) tetapi memiliki ver 8 sebagai gantinya. Eksekusi ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibmemperbaiki masalah kode pindai, tetapi tidak mengembalikan perintah history. Meskipun dalam kasus ini, setengah perbaikan lebih baik daripada tidak sama sekali. (Ya, saya juga menambahkan tautan untuk 6, tidak ada perbedaan). Tambahan: ini / hanya masalah dengan python2 bagi saya. python3 bekerja dengan baik tanpa tautan.
Zim
51

Pada OS X, pembaruan Xcode terkadang rusak readline. Larutan:

brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline

Jika masalah masih berlanjut, cobalah untuk menghapus readlinemenggunakan pipdan menginstalnya menggunakan easy_install:

pip3 uninstall readline
easy_install readline
Max Malysh
sumber
apakah ada yang setara jika Anda menggunakan sistem Python 2.7.10?
user5359531
3
@ user5359531 Saya telah memperbarui jawaban dengan easy_installopsi
Max Malysh
Pengguna OSX 10.12 juga: stackoverflow.com/questions/7375545/…
ptim
1
Menggunakan easy_installberfungsi untuk saya, sedangkan yang dengan pip tidak bekerja.
justhalf
1
Ini dikombinasikan dengan brew link readline(meskipun sudah ditautkan) memperbaikinya untuk saya.
Richard Rast
28

Di OS X, menggunakan python 3.5 dan virtualenv

$ pip install gnureadline

Dalam penerjemah lakukan:

import gnureadline

Sekarang tombol panah harus berfungsi dengan baik.


Informasi tambahan...

Perhatikan bahwa pada 1 Oktober 2015 - readline telah DIHAPUSKAN (sumber https://github.com/ludwigschwardt/python-readline )

Gunakan gnureadline sebagai gantinya (lihat: https://github.com/ludwigschwardt/python-gnureadline )

Jika saya menginstal readline alih-alih gnureadline menggunakan python 3.5, saya menerima kesalahan setelah mencoba mengimpor di interpreter:

>>> import readline
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so
  Reason: image not found
pengguna12345
sumber
ini berfungsi, tetapi itu berarti saya perlu menambahkan import gnureadlinedi bagian atas setiap sesi interaktif yang benar-benar menjengkelkan. Apakah ada cara untuk memulai ini di awal setiap sesi interaktif?
Anton Codes
1
@Panchishin mencoba menggunakan variabel lingkungan PYTHONSTARTUP untuk memberi nama file yang memiliki perintah Python dieksekusi sebelum prompt interaktif ditampilkan (yaitu import gnureadline). Untuk ide-ide lain yang mungkin juga lihat: jalankan interpreter baris perintah python dengan impor dimuat secara otomatis
user12345
20

Saya telah mengalami masalah ini baru-baru ini dan setelah membaca banyak tentang pip install readline(tidak berfungsi untuk mac osx) dan pip install gnureadlinedan tidak puas, ini sekarang setup saya yang memungkinkan menggunakan tombol panah di konsol python:

  1. instal gnureadline menggunakan pip install gnureadline

sekarang Anda dapat melakukannya import gnureadlinedan tombol panah harus berfungsi seperti yang diharapkan. Untuk membuatnya bekerja secara otomatis ikuti langkah-langkah berikut:

  1. buat (atau tambahkan ke) file ~/.startup.py:import gnureadline
  2. tambahkan ke file ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Satu hal yang tidak berfungsi, tetapi berhasil di pengaturan saya sebelumnya adalah: impor otomatis gnureadline aktif pdb.set_trace(). Jika ada yang punya solusi yang baik untuk masalah ini saya akan berterima kasih atas komentarnya.

David Schumann
sumber
15
  1. instal paket readline-devel.
  2. mengkompilasi ulang python dengan modul readline
  3. Bingo!
Eric Wang
sumber
2
Terima kasih telah meningkatkan kualitas hidup saya! {;-) Pada Centos 5.5, itu yum menginstal readline-devel dan Anda tidak harus secara eksplisit menentukan readline dalam kompilasi
michela
3
Bagaimana kita mengkompilasi ulang Python? Apakah saya perlu menginstal ekstrak python dari source (./configure, make, make install), mengatur virtualenv dan menginstal semua paket saya lagi?
Muhammad Waqar
14

Saya punya masalah dengan histori shell (perintah tab / panah) dari Python 3.6.x di Ubuntu 16.04 LTS.

Python 3.6.x diinstal dari sumber.

Apa yang dipecahkan bagi saya adalah menginstal modul "gnureadline" seperti yang dikatakan oleh user12345, menggunakan baris perintah ini:

sudo pip3.6 install gnureadline

:)

Serza
sumber
1
Saya mencoba semua solusi lain tetapi yang ini bekerja untuk saya untuk Python 3.6
Umair
1
pastikan untuk memanggil import gnureadlineshell agar berfungsi
David Schumann
3
Tidak perlu menggunakan sudo
Newalp
11

Inilah langkah-langkah yang berhasil bagi saya di ubuntu 12.04 untuk python 3.3.

1) buka teminal dan tulis sudo apt-get install libreadline-dev

2) unduh file sumber python 3.3.2 dari http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) ekstrak dan arahkan ke direktori Python-3.3.2 / dalam sebuah shell

4) jalankan perintah berikut:

./configure
make
make test
sudo make install
aabha
sumber
7

Terkena dampak setelah memutakhirkan Mac ke High Sierra, ini berhasil menyelesaikannya untuk saya:

brew unlink python
xcode-select --install
brew install python
Perm besar
sumber
5

Pada CentOS, saya memperbaikinya dengan

yum install readline-devel

dan kemudian mengkompilasi ulang python 3.4.

Pada OpenSUSE, saya memperbaikinya dengan

pip3 install readline

mengikuti jawaban Valerio Crini.

Mungkin "pip3 install readline" adalah solusi umum. Belum mencoba CentOS saya.

peter pan gz
sumber
Panggilan bagus dengan ujung readline-devel. Itu bekerja untuk saya pada mesin Centos6.5 rumming python 2.7.8. Saya langsung menelepon pip install readlinetanpa mengkompilasi ulang python dan itu bekerja dengan baik.
Arjun
3

Saya memperbaikinya dengan melakukan hal berikut:

  • yum instal readline-devel
  • instal readline

    • Saya menemukan kesalahan lain di sini:

      gcc: readline/libreadline.a: No such file or directory

      gcc: readline/libhistory.a: No such file or directory

      Saya memperbaikinya dengan menginstal patch:

      yum install patch

Setelah itu saya berhasil menjalankan pip install readlineyang memecahkan karakter melarikan diri di shell python saya.

FYI, saya menggunakan RedHat

juanpaolo
sumber
CentOS 6.8, Python2.7.12, sukses
kkzxak47
3

Jika Anda menggunakan Anaconda Python, Anda dapat memperbaikinya dengan menjalankan:

conda install readline

Bekerja untukku!

Adam Stewart
sumber
2
Dalam kasus saya, readlinesudah diinstal, saya harus lakukan conda install ncursesuntuk membuatnya berfungsi.
whenov
3

Bagi mereka yang menggunakan conda, menginstal paket readline dari conda-forge channel akan memperbaiki masalah:

conda install -c conda-forge readline=6.2
Tomas Ruiz
sumber
3

Tidak ada jawaban ini yang berfungsi untuk saya di dua versi Ubuntu yang berbeda. Apa yang berhasil bagi saya, tetapi bukan perbaikan yang benar, adalah membungkus kode python saya dalam panggilan ke rlwrap(tersedia di repositori ubuntu):

rlwrap python mycode.py

Da Vinci
sumber
2

Apakah Anda memanggil ssh dengan parameter -t untuk memberi tahu ssh untuk mengalokasikan terminal virtual untuk Anda?

Dari halaman manual:

t
Angkatan alokasi pseudo-tty. Ini dapat digunakan untuk menjalankan program berbasis layar yang sewenang-wenang pada mesin jarak jauh, yang bisa sangat berguna, misalnya ketika mengimplementasikan layanan menu. Opsi -t ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal.

Selain itu Anda mungkin juga harus mengatur variabel lingkungan TERM di server dengan benar seperti yang disarankan dalam posting lain.

lothar
sumber
2

Pada Mac OS X Mojave 10.14.6 dengan berbagai pemasangan historis melalui brewsaya menyelesaikan ini dengan:

brew reinstall python2

Kemungkinan tidak ada peluru ajaib yang diberikan setiap orang memiliki skenario pemasangan yang berbeda. Saya mencoba di atas juga jadi mungkin kombinasi dari beberapa jawaban. Brew default python3jadi jika Anda menginstal python2paket itu juga perlu diinstal ulang.

robertmoggach
sumber
1

Sudahkah Anda mencoba menggunakan klien SSH yang berbeda? Beberapa klien SSH memiliki keymappings built-in khusus untuk proses jarak jauh yang berbeda. Saya sering mengalami hal ini dengan emacs.

Klien apa yang Anda gunakan? Saya akan merekomendasikan mencoba Putty dan SecureCRT untuk membandingkan perilaku mereka.

JoshJordan
sumber
Hmm, saya hanya menggunakan perintah ssh di terminal (ssh -v mengatakan OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003).
Frank
Cobalah Putty (gratis) dan kembalilah ke kami :)
JoshJordan
Oke, saya baru saja menginstal dempul dan menggunakannya untuk terhubung ke mesin, tetapi perilaku ada yang sama.
Frank
:( Pasti masalah sisi server. Saya akan memeriksanya dan kembali kepada Anda.
JoshJordan
Menggunakan perintah ssh untuk terhubung ke beberapa mesin lain berfungsi dengan baik: Di sana, saya tidak punya masalah dengan tombol panah. Tampaknya menjadi satu-satunya sistem yang mengalami masalah.
Frank
1

modul readline telah usang yang akan menyebabkan kesalahan pointer tidak valid dalam versi python terbaru saat mengeksekusi exit () atau exit () di python shell. pip install gnureadlinesebagai gantinya

Bill Greens
sumber
0

Bagaimana variabel env Anda $ TERM mengatur [a] ketika semuanya berfungsi dengan baik dan [b] ketika tidak? Pengaturan ENV sering merupakan kunci untuk masalah seperti itu.

Alex Martelli
sumber
1
Saya baru saja mencoba beberapa nilai variabel TERM: vt102, vt220, ansi, xterm, tetapi tidak satupun dari mereka yang mengubah perilaku.
Frank
0

Cobalah menjalankan pustaka kode kunci di server. Jika tidak berhasil, cobalah mengunduh perpustakaan dengan kemampuan baca-kunci.

Menarik...
sumber
0

Saya mencoba membangun Python 2.7 di Ubuntu 14.0. Anda membutuhkan libreadline-dev. Namun, jika Anda mendapatkannya dari apt-get, versi saat ini adalah 6.3, yang tidak kompatibel dengan Python 2.7 (tidak yakin tentang Python 3). Misalnya, tipe data "Function" dan "CPPFunction", yang didefinisikan dalam versi readline sebelumnya telah dihapus di 6.3, seperti yang dilaporkan di sini:

https://github.com/yyuu/pyenv/issues/126

Artinya Anda perlu mendapatkan kode sumber dari versi readline sebelumnya. Saya menginstal libreadline 5.2 dari apt-get untuk perpustakaan, dan mendapatkan kode sumber 5.2 untuk file header. Letakkan di / usr / include.

Akhirnya masalah telah teratasi.

AeroD
sumber
0

Pada MacOsx, saya memperbaikinya dengan menginstal ulang readline

brew reinstall readline
SHYAM SHINDE
sumber