Python kabuğunda ok tuşlarına basarken kaçış karakterlerini görme


191

Etkileşimli python kabuğu gibi kabuklarda, genellikle geçerli satırda hareket etmek veya önceki komutları (yukarı oklu) vb. Almak için ok tuşlarını kullanabilirsiniz.

Ama başka bir makineye girdikten ve pythonoraya başladıktan sonra, aşağıdaki gibi oturumlar alıyorum:

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

burada son karakter yukarı oktan gelir. Veya sol ok kullanarak:

>>> impor^[[D

Bunu nasıl düzeltebilirim?

Normal bash'da ok tuşları iyi çalışıyor. Tuhaf davranış sadece etkileşimli python (veya perl vb.) Kabuğundadır.


Bunun sunucu hatasına ait olduğunu düşünüyorum. Bu, yanlış bir terminal tipinden kaynaklanır.
epochwolf

Aşağıdaki cartman ile terminal tipi bir sorun değil, bir readline sorunu olduğunu kabul ediyorum.
Frank

2
easy_install readline ve sonra easy_install ipython, mac'ta mükemmel çalışır.
gnuyoga

anaconda2 veya anaconda3'ü kurun ve .pystartup'ı ayarlayın, lütfen bağlantıya
Leon WANG

1
@LeonWANG kötü bir yanıt verir - sadece .pystartup dosyanızı çalıştırmak için anaconda kadar büyük bir şey yüklemeyin. Tamamen gereksiz.
jdogg

Yanıtlar:


38

Readline'ın etkin olmadığı anlaşılıyor. PYTHONSTARTUPDeğişkenin tanımlanıp tanımlanmadığını kontrol edin , benim için işaret eder /etc/pythonstartve etkileşimli olmadan önce bu dosya python işlemi tarafından yürütülür, bu da readline / geçmiş işlemeyi ayarlar.

@ Chown sayesinde buradaki dokümanlar: http://docs.python.org/2/tutorial/interactive.html


Teşekkür ederim, katılıyorum mesele gibi görünüyor. Sistemde /usr/lib/libreadline.so.5 var. / Etc / pythonstart yok.
Frank

1
Biraz googling yaptıktan sonra, readline-devel yüklendikten sonra bu sistemdeki python'un yeniden derlenmesi gerekebilir.
Frank

1
Ortam değişkeni PYTHONSTARTUPdeğil PYTHONSTART. Dağıtıma özgü /etc/pythonstartdosyadan emin değilim .
Ned Deily

1
Aslında okuma docs.python.org/2/tutorial/interactive.html bir pystartup dosyası için gerekli tüm bilgi verir.
Ocak'ta chown

7
brew reinstall python3
Demlemek

102

Bu sorunu readlinepaket yükleyerek çözdüm :

pip install readline

24
libncurses-devUbuntu makineme kurmak zorunda kaldım , daha sonra readline doğru kuruldu.
Amir Eldor

4
Yüklü ncurses-develsonra CentOS üzerinde ve readlinehiçbir sorunla yüklü. Etkileşimli kabuk şu anda çalışıyor.
one.time

1
yum ncurses-devel yükleyin
Alex Punnen

4
olamaz pip install readlinebenim OS X makinede, sonra bile başarıyla yapıyor her seferinde başarısızbrew install readline
user5359531

10
Bunun gnureadlineyerine yüklemek zorunda kaldım , bkz. Stackoverflow.com/q/43013060/2846923
Şapkalı Adam

82

OS X'te farklı sorunum var.

Sistem python kabuğu kullandığımda, anahtarlar sorun değil, virtualenv'de sorun. Virtualenv / readline'ı yeniden kurmaya / yükseltmeye çalıştım ve hiçbir şey düzeltilmedi.

Ben import readlinesorun python kabuk çalışırken , bu hata iletisini alın:

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

Çünkü var /usr/local/opt/readline/lib/libreadline.7.dylibama yok libreadline.6.dylib, bu yüzden bir sembol bağlantısı yapıyorum:

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

Problem çözüldü!


Baktıktan ve baktıktan sonra bu öneriyle sorunu çözebildim. Teşekkürler!
gl051

Bir şey v6 çağırıyorsa, aslında v7 olduğunu fark etmiyorsa bu bir soruna neden olmaz mı?
Adam Barnes

3
Aynı problemim vardı, ama bu talimatlar yerine, yaptım brew update && brew upgrade. Bu süreçte PHP'nin kırılıp kırılmadığı henüz görülmedi.
Adam Barnes

@AdamBarnes Bu da benim için hile yaptı. Ben de pyenv kullanıyorum, bu yüzden tüm homebrew paketlerini yükselttikten sonra ihtiyacım olan python sürümlerini kaldırmayı / yeniden yüklemeyi unutmayın.
funseiki

3
Libreadline.7.dylib (belki de Mojave 10.14.x kullanıyorum ve sonra XCode 10.2.1'i güncellediğim için) yoktu ama bunun yerine ver 8 vardı. Yürütme ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib, tarama kodları sorununu çözdü, ancak geçmiş komutunu geri çağırmayı geri getirmedi. Bu durumda, yarım bir düzeltme hiçbir şeyden daha iyidir. (Evet, ayrıca 6 için bir bağlantı ekledim, fark yok). Zeyilname: Bu benim için sadece python2 ile ilgili bir sorundu. python3 bağlantılar olmadan iyi çalıştı.
Zim

51

OS X'te, Xcode güncellemeleri bazen bozulur readline. Çözüm:

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

Sorun devam ederse, readlinekullanarak kaldırmayı deneyin ve kullanarak pipyükleyin easy_install:

pip3 uninstall readline
easy_install readline

2.7.10 sistemini kullanıyorsanız bir eşdeğer var mı?
user5359531

3
@ user5359531 Cevabı bir easy_installseçenekle güncelledim
Max Malysh

OSX 10.12 kullanıcıları ayrıca: stackoverflow.com/questions/7375545/…
ptim

1
Kullanılması easy_installpip ile bir çalışmaz iken, benim için işler.
justhalf

1
Bu brew link readline(zaten bağlı olmasına rağmen) ile birlikte benim için düzeltti.
Richard Rast

28

OS X'te, python 3.5 ve virtualenv kullanma

$ pip install gnureadline

Tercümanda şunları yapın:

import gnureadline

Şimdi ok tuşları düzgün çalışmalıdır.


Ek bilgi...

1 Ekim 2015 - readline'ın DEPRECATED olduğunu unutmayın (kaynak https://github.com/ludwigschwardt/python-readline )

Kullanım gnureadline yerine (bkz: https://github.com/ludwigschwardt/python-gnureadline )

Python 3.5 kullanarak gnureadline yerine readline yüklersem, yorumlayıcıda alma girişiminden sonra hata alıyorum:

>>> 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

Bu işe yarıyor, ama bu import gnureadlinegerçekten can sıkıcı her interaktif oturumun üstüne eklemek gerekir anlamına gelir . Her etkileşimli oturumun başında bunu başlatmanın bir yolu var mı?
Anton Kodları

1
@Panchishin , etkileşimli bilgi istemi görüntülenmeden önce Python komutları yürütülmüş bir dosyayı adlandırmak için PYTHONSTARTUP ortam değişkenini kullanmaya çalışın (örn. import gnureadline). Diğer olası fikirler için ayrıca bkz: otomatik olarak yüklenen içe
aktarmalarla

20

Son zamanlarda ve bu konuda çok fazla okuduktan sonra pip install readline(mac osx için çalışmaz) ve pip install gnureadlinetatmin olmadıktan sonra, bu artık herhangi bir python konsolunda ok tuşlarını kullanmayı sağlayan kurulumum:

  1. kullanarak gnureadline yükleyin pip install gnureadline

şimdi ya yapabilirsiniz import gnureadlineve ok tuşları beklendiği gibi çalışması gerekir. Otomatik olarak çalışmalarını sağlamak için aşağıdaki adımları izleyin:

  1. dosya oluştur (veya dosyaya ekle) ~/.startup.py:import gnureadline
  2. dosyaya ekle ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Çalışmayan, ancak önceki kurulumumda yaptığım bir şey: gnureadline'ın otomatik olarak içe aktarılması pdb.set_trace(). Herkes bu soruna iyi bir çözüm varsa bir yorum için minnettar olacaktır.


15
  1. readline-devel paketini kurun.
  2. python'u readline modülü ile yeniden derleyin
  3. Bingo!

2
Yaşam kalitemi arttırdığınız için teşekkürler! {;-) Centos 5.5'te bu yum installline-devel'i kuruyor ve yeniden derlemede readline'ı açıkça belirtmeniz gerekmiyor
michela

3
Python'u nasıl yeniden derleriz? Extract python'u kaynaktan (./configure, make, install yap) kurmalı, virtualenv kurmalı ve tüm paketlerimi tekrar yüklemem gerekiyor mu?
Muhammed Waqar

14

Ubuntu 16.04 LTS'de Python 3.6.x'in kabuk geçmişi (sekme / oklar komutları) ile ilgili sorunlar yaşadım.

Python 3.6.x kaynaktan yüklendi.

Benim için çözülen, şu komut satırını kullanarak user12345 tarafından söylendiği gibi "gnureadline" modülünü kurmaktı:

sudo pip3.6 install gnureadline

:)


1
Diğer tüm çözümleri denedim ama bu benim için Python 3.6
Umair

1
import gnureadlineçalışması için
David Schumann

3
Sudo


7

Mac'i High Sierra'ya yükselttikten sonra etkilendi, bu benim için başarıyla çözdü:

brew unlink python
xcode-select --install
brew install python

5

CentOS'ta bunu düzeltirim

yum install readline-devel

ve sonra python 3.4'ü yeniden derleyin.

OpenSUSE üzerinde bunu düzeltiyorum

pip3 install readline

Valerio Crini'nin cevabını takiben.

Belki de "pip3 install readline" genel bir çözümdür. CentOS'umda denemedim.


Readline-devel ucu ile iyi bir çağrı. Benim için bir Centos6.5 makine geviş python 2.7.8 üzerinde çalıştı. pip install readlinePython derlemeden doğrudan aradım ve iyi çalıştı.
Arjun

3

Bunu aşağıdakileri yaparak düzelttim:

  • yum install readline-devel
  • pip install readline

    • Burada başka bir hatayla karşılaştım:

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

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

      Bunu yükleyerek düzelttim patch:

      yum install patch

Bundan sonra pip install readlinepython kabuğumdaki kaçış karakterlerini çözen başarılı bir şekilde çalışmayı başardım .

FYI, RedHat kullanıyorum


CentOS 6.8, Python2.7.12, bir başarı
kkzxak47

3

Anaconda Python kullanıyorsanız, bunu çalıştırarak düzeltebilirsiniz:

conda install readline

Benim için çalıştı!


2
Benim durumumda, readlinezaten yüklü, conda install ncursesçalışması için yapmak zorundayım.
whenov

3

Conda kullananlar için, readline paketini conda-forge kanalından yüklemek sorunu çözecektir:

conda install -c conda-forge readline=6.2

3

Bu cevapların hiçbiri benim için iki farklı Ubuntu sürümünde işe yaramadı. Benim için işe yarayan, ancak gerçek bir düzeltme olmayan şey, rlwrap(ubuntu depolarında bulunan) bir çağrıda python kodumu sarmaktır:

rlwrap python mycode.py


2

Ssh'yi -t parametresiyle çağırıp ssh'ye sanal terminal atamasını söylediniz mi?

Man sayfasından:

-t
Yalancı tty ayırmayı zorla. Bu, uzak bir makinede, örneğin menü hizmetlerini uygularken çok yararlı olabilecek, rasgele ekran tabanlı programlar yürütmek için kullanılabilir. Birden fazla -t seçeneği, ssh yerel tty olmasa bile tty ayırmayı zorlar.

Ayrıca , başka bir gönderide önerildiği gibi sunucudaki TERM ortam değişkenini doğru ayarlamanız gerekebilir .


2

Mac OS X Mojave 10.14.6 ile çeşitli tarihsel yüklemelerle brewbunu çözdüm :

brew reinstall python2

Herkesin farklı bir yükleme senaryosu olduğu göz önüne alındığında sihirli bir kurşun yoktur. Yukarıda da denedim, bu yüzden birkaç cevaptan oluşan bir kombinasyon olabilir. Demleme varsayılanıdır, python3bu yüzden python2paketi yüklediyseniz yeniden yüklenmesi gerekir.


1

Farklı bir SSH istemcisi kullanmayı denediniz mi? Bazı SSH istemcileri, farklı uzak işlemler için özel, yerleşik tuş eşlemelerine sahiptir. Emacs ile çok fazla karşılaştım.

Hangi müşteriyi kullanıyorsunuz? Davranışlarını karşılaştırmak için Putty ve SecureCRT'yi denemenizi tavsiye ederim.


Hmm, sadece terminaldeki ssh komutunu kullanıyorum (ssh -v OpenSSH_3.9p1, OpenSSL 0.9.7a 19 Şubat 2003 diyor).
Frank

Putty'yi deneyin (ücretsiz) ve bize geri dönün :)
JoshJordan

Tamam, sadece macun taktım ve makineye bağlanmak için kullandım, ama orada davranış aynı.
Frank

:( Kesinlikle bir sunucu tarafı sorunu O zaman içine bakıp size döneceğim.
JoshJordan

Başka bir makineye bağlanmak için ssh komutunu kullanmak iyi çalışıyor: Burada ok tuşlarıyla sorunum yok. Sorun yaşayan tek bir sistem gibi görünüyor.
Frank

1

Python kabuğunda quit () veya exit () yürütülürken en son python sürümlerinde geçersiz işaretçi hatasına neden olacak readline modülü kullanımdan kaldırılmıştır. pip install gnureadlineyerine


0

Env değişkeniniz $ TERM, işler düzgün çalıştığında [a] ve yapılmadığında [b] nasıl ayarlanır? Env ayarları genellikle bu tür sorunların anahtarıdır.


1
Ben sadece bazı TERM değişken değerleri denedim: vt102, vt220, ansi, xterm, ama hiçbiri davranışı değiştirmedi.
Frank

0

Sunucuda çalışan bir anahtar kodu kitaplığı almayı deneyin. Bu işe yaramazsa, okuma anahtarı özelliğine sahip bir kütüphane indirmeyi deneyin.


0

Ubuntu 14.0'da Python 2.7 oluşturmaya çalışıyordum. Libreadline-dev'e ihtiyacınız olacak. Ancak, apt-get'den alırsanız, geçerli sürüm 6.3'tir ve Python 2.7 ile uyumlu değildir (Python 3'ten emin değilim). Örneğin, okuma satırının önceki sürümlerinde tanımlanan "İşlev" ve "CPPFunction" veri türü, burada bildirildiği gibi 6.3'te kaldırılmıştır:

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

Yani readline'ın önceki bir sürümünün kaynak kodunu almanız gerekir. Kütüphane için apt-get'den libreadline 5.2'yi yükledim ve başlık dosyaları için 5.2 kaynak kodunu aldım. Bunları / usr / include içine koyun.

Sonunda sorun çözüldü.


0

MacOsx'ta bunu readline'ı yeniden yükleyerek çözdüm

brew reinstall readline
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.