Nhìn thấy các ký tự thoát khi nhấn các phím mũi tên trong shell python


191

Trong các shell như shell python tương tác, bạn thường có thể sử dụng các phím mũi tên để di chuyển xung quanh trong dòng hiện tại hoặc nhận các lệnh trước đó (với mũi tên lên), v.v.

Nhưng sau khi tôi ssh vào một máy khác và bắt đầu pythonở đó, tôi nhận được các phiên như:

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

trong đó nhân vật cuối cùng xuất phát từ mũi tên lên. Hoặc, sử dụng mũi tên trái:

>>> impor^[[D

Làm thế nào tôi có thể sửa lỗi này?

Trong bash thông thường, các phím mũi tên hoạt động tốt. Hành vi kỳ lạ chỉ nằm trong lớp vỏ trăn tương tác (hoặc perl, v.v.).


Tôi nghĩ rằng điều này thuộc về lỗi máy chủ. Điều này được gây ra bởi một loại thiết bị đầu cuối không chính xác.
epochwolf

Tôi đồng ý với cartman bên dưới rằng đó là vấn đề về đường đọc, không phải là vấn đề kiểu thiết bị đầu cuối.
Frank

2
easy_install readline và sau đó easy_install ipython hoạt động hoàn hảo trong mac.
gnuyoga

cài đặt anaconda2 hoặc anaconda3 và đặt .pystartup vui lòng xem liên kết
Leon WANG

1
@LeonWANG đưa ra một câu trả lời tồi - đừng cài đặt một cái gì đó lớn như anaconda chỉ để tập tin .pystartup của bạn hoạt động. Hoàn toàn không cần thiết.
jdogg

Câu trả lời:


38

Có vẻ như readline không được kích hoạt. Kiểm tra xem PYTHONSTARTUPbiến có được xác định không, đối với tôi, nó trỏ đến /etc/pythonstartvà tệp đó được thực thi bởi quy trình python trước khi đi tương tác, thiết lập xử lý readline / history.

Cảm ơn @chown đây là các tài liệu về điều này: http://docs.python.org/2/tutorial/interactive.html


Cảm ơn, tôi đồng ý rằng readline dường như là vấn đề. Hệ thống có /usr/lib/libreadline.so.5 mặc dù. Không có / etc / pythonstart.
Frank

1
Sau khi googling, có vẻ như python trên hệ thống đó có thể phải được biên dịch lại, sau khi cài đặt readline-devel.
Frank

1
Các biến môi trường là PYTHONSTARTUP, không PYTHONSTART. Không chắc chắn về các /etc/pythonstarttập tin cụ thể phân phối .
Ned Deily

1
Trên thực tế, việc đọc docs.python.org/2/tutorial/interactive.html cung cấp tất cả thông tin cần thiết cho tệp pystartup.
chown

7
Trên OSX với brew, tất cả những gì tôi phải làm làbrew reinstall python3
Ranhiru Jude Cooray

102

Tôi đã giải quyết vấn đề này bằng cách cài đặt readlinegói:

pip install readline

24
Tôi đã phải cài đặt libncurses-devtrên máy Ubuntu của mình, sau đó cài đặt chính xác.
Amir Eldor

4
Được cài đặt ncurses-develtrên CentOS và sau đó readlinecài đặt không có vấn đề. Shell tương tác hiện đang làm việc.
giờ vào

1
yum cài đặt ncurses-devel
Alex Punnen

4
không thể pip install readlinetrên máy OS X của tôi, luôn bị lỗi ngay cả khi đã thực hiện thành côngbrew install readline
user5359531

9
Tôi đã phải cài đặt gnureadlinethay thế, xem stackoverflow.com/q/43013060/2846923
The Guy with The Hat

82

Trên OS X, tôi có vấn đề khác.

Khi tôi sử dụng hệ thống python shell, các phím không có vấn đề, nhưng vấn đề trong virtualenv. Tôi sẽ cố gắng cài đặt lại / nâng cấp virtualenv / readline và không có gì cố định.

Trong khi tôi cố gắng import readlinetrong vấn đề python shell, nhận được thông báo lỗi này:

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

Vì có /usr/local/opt/readline/lib/libreadline.7.dylibnhưng không libreadline.6.dylib, vì vậy tôi tạo một liên kết biểu tượng:

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

Vấn đề đã được giải quyết!


Sau khi tìm kiếm, tôi đã có thể khắc phục vấn đề với đề xuất này. Cảm ơn!
gl051

Điều này có gây ra sự cố không nếu có thứ gì đó gọi v6, không nhận ra rằng đó thực sự là v7?
Adam Barnes

3
Tôi đã có cùng một vấn đề, nhưng thay vì những hướng dẫn này, tôi đã làm brew update && brew upgrade. Cho dù điều này đã phá vỡ PHP trong quá trình vẫn chưa được nhìn thấy.
Adam Barnes

@AdamBarnes Điều này cũng đã lừa tôi. Tôi cũng sử dụng pyenv, vì vậy hãy đảm bảo gỡ cài đặt / cài đặt lại các phiên bản python mà tôi cần sau khi nâng cấp tất cả các gói homebrew.
funseiki

3
Tôi không có libreadline.7.dylib (có lẽ vì tôi đang dùng Mojave 10.14.x và sau đó cập nhật XCode 10.2.1) nhưng đã có ver 8 thay thế. Việc thực thi đã ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibkhắc phục sự cố mã quét, nhưng không mang lại lệnh thu hồi lịch sử. Mặc dù trong trường hợp này, một nửa sửa chữa là tốt hơn không có. (Có, tôi cũng đã thêm một liên kết cho 6, không có sự khác biệt). Phụ lục: đây là / chỉ là một vấn đề với python2 đối với tôi. python3 hoạt động tốt mà không cần các liên kết.
Zim

51

Trên OS X, cập nhật Xcode đôi khi bị hỏng readline. Giải pháp:

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

Nếu sự cố vẫn còn, hãy thử xóa readlinebằng cách sử dụng pipvà cài đặt bằng cách sử dụng easy_install:

pip3 uninstall readline
easy_install readline

Có tương đương nếu bạn đang sử dụng hệ thống Python 2.7.10?
dùng5359531

3
@ user5359531 Tôi đã cập nhật câu trả lời với một easy_installtùy chọn
Max Malysh

Người dùng OSX 10.12 cũng: stackoverflow.com/questions/7375545/ từ
ptim

1
Sử dụng easy_installlàm việc cho tôi, trong khi một với pip không hoạt động.
ngay

1
Điều này kết hợp với brew link readline(mặc dù nó đã được liên kết) đã sửa nó cho tôi.
Richard Rast

28

Trên OS X, sử dụng python 3.5 và virtualenv

$ pip install gnureadline

Trong phiên dịch làm:

import gnureadline

Bây giờ các phím mũi tên nên hoạt động đúng.


Thông tin thêm...

Lưu ý rằng kể từ ngày 1 tháng 10 năm 2015 - đường dẫn đã được ĐỔI (nguồn https://github.com/ludwigschwardt/python-readline )

Sử dụng gnureadline thay thế (xem: https://github.com/ludwigschwardt/python-gnureadline )

Nếu tôi cài đặt readline thay vì gnureadline bằng python 3.5, tôi sẽ gặp lỗi sau khi thử nhập trình thông dịch:

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

Điều này hoạt động, nhưng nó có nghĩa là tôi cần thêm import gnureadlinevào đầu mỗi phiên tương tác thực sự gây phiền nhiễu. Có cách nào để khởi động điều này vào đầu mỗi phiên tương tác không?
Mã Anton

1
@Panchishin thử sử dụng biến môi trường PYTHONSTARTUP để đặt tên cho một tệp có các lệnh Python được thực thi trước khi dấu nhắc tương tác được hiển thị (nghĩa là import gnureadline). Để biết các ý tưởng khác cũng có thể xem: chạy trình thông dịch dòng lệnh python với nhập khẩu được tải tự động
user12345

19

Tôi đã gặp vấn đề này gần đây và sau khi đọc rất nhiều về pip install readline(không hoạt động cho mac osx) pip install gnureadlinevà không hài lòng, đây là thiết lập của tôi cho phép sử dụng các phím mũi tên trong bất kỳ bảng điều khiển python nào:

  1. cài đặt gnureadline bằng pip install gnureadline

bây giờ bạn có thể làm import gnureadlinevà các phím mũi tên sẽ hoạt động như mong đợi. Để làm cho chúng hoạt động tự động theo các bước sau:

  1. tạo (hoặc nối vào) tệp ~/.startup.py:import gnureadline
  2. chắp thêm vào tập tin ~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

Một điều không hoạt động, nhưng đã làm trong thiết lập trước đó của tôi là: tự động nhập gnureadline vào pdb.set_trace(). Nếu bất cứ ai có một giải pháp tốt cho vấn đề này, tôi sẽ rất biết ơn cho một nhận xét.


15
  1. cài đặt gói readline-devel.
  2. biên dịch lại python với mô-đun readline
  3. Chơi lô tô!

2
Cảm ơn đã cải thiện chất lượng cuộc sống của tôi! {;-) Trên Centos 5.5, đó là cài đặt readline-devel và bạn không phải chỉ định rõ ràng đường đọc trong phần biên dịch lại
michela

3
Làm thế nào để chúng tôi biên dịch lại Python? Tôi có cần phải cài đặt trích xuất python từ nguồn (./mình, tạo, thực hiện cài đặt), thiết lập virtualenv và cài đặt lại tất cả các gói của tôi không?
Muhammad Waqar

14

Tôi gặp vấn đề với lịch sử shell (lệnh tab / mũi tên) của Python 3.6.x trên Ubuntu 16.04 LTS.

Python 3.6.x đã được cài đặt từ nguồn.

Điều giải quyết cho tôi là cài đặt mô-đun "gnureadline" như đã nói bởi user12345, sử dụng dòng lệnh này:

sudo pip3.6 install gnureadline

:)


1
Tôi đã thử tất cả các giải pháp khác nhưng giải pháp này hiệu quả với tôi cho Python 3.6
Umair

1
đảm bảo gọi import gnureadlinevỏ để nó hoạt động
David Schumann

3
Không cần sử dụng sudo
Newalp 16/03/19

11

Dưới đây là các bước làm việc với tôi trong Ubuntu 12.04 cho python 3.3.

1) mở tem và viết sudo apt-get install libreadline-dev

2) tải xuống tệp nguồn của python 3.3.2 từ http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) giải nén nó và điều hướng đến thư mục Python-3.3.2 / trong shell

4) thực hiện lệnh sau:

./configure
make
make test
sudo make install

7

Đã bị ảnh hưởng sau khi nâng cấp Mac lên High Sierra, điều này đã giải quyết thành công cho tôi:

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

5

Trên CentOS, tôi sửa lỗi này bằng cách

yum install readline-devel

và sau đó biên dịch lại python 3.4.

Trên OpenSUSE, tôi sửa lỗi này bằng cách

pip3 install readline

theo câu trả lời của Valerio Crini.

Có lẽ "pip3 install readline" là một giải pháp chung. Chưa thử trên CentOS của tôi.


Cuộc gọi tốt với các mẹo đọc-phát. Nó hoạt động với tôi trên máy Centos6.5 rumming python 2.7.8. Tôi trực tiếp gọi pip install readlinemà không biên dịch lại python và nó hoạt động tốt.
Arjun

3

Tôi đã sửa lỗi này bằng cách làm như sau:

  • yum cài đặt readline-devel
  • cài đặt đường ống dẫn

    • Tôi gặp một lỗi khác ở đây:

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

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

      Tôi đã sửa lỗi này bằng cách cài đặt patch:

      yum install patch

Sau đó, tôi đã chạy pip install readlinethành công để giải quyết các ký tự thoát trong vỏ trăn của mình.

FYI, tôi đang sử dụng RedHat


CentOS 6.8, Python2.7.12, thành công
kkzxak47

3

Nếu bạn sử dụng Anaconda Python, bạn có thể khắc phục điều này bằng cách chạy:

conda install readline

Đã làm cho tôi!


2
Trong trường hợp của tôi, readlineđã được cài đặt, tôi phải làm conda install ncursesđể làm cho nó hoạt động.
khiov

3

Đối với những người sử dụng conda, cài đặt gói readline từ kênh conda-forge sẽ khắc phục vấn đề:

conda install -c conda-forge readline=6.2

2

Bạn đã gọi ssh với tham số -t để báo cho ssh phân bổ thiết bị đầu cuối ảo cho bạn?

Từ trang người đàn ông:

-t
Buộc phân bổ giả. Điều này có thể được sử dụng để thực thi các chương trình dựa trên màn hình tùy ý trên một máy từ xa, có thể rất hữu ích, ví dụ như khi triển khai các dịch vụ menu. Nhiều tùy chọn -t buộc phân bổ tty, ngay cả khi ssh không có tty cục bộ.

Ngoài ra, bạn cũng có thể phải đặt biến môi trường TERM trên máy chủ chính xác như được đề xuất trong bài đăng khác.


2

Trên Mac OS X Mojave 10.14.6 với nhiều cài đặt lịch sử khác nhau thông qua brewtôi đã giải quyết vấn đề này với:

brew reinstall python2

Có khả năng không có viên đạn ma thuật nào được đưa ra cho mọi người có một kịch bản cài đặt khác nhau. Tôi cũng đã thử ở trên vì vậy nó có thể là sự kết hợp của một vài câu trả lời. Mặc định là python3do nếu bạn cài đặt python2gói, nó cũng cần phải được cài đặt lại.


2

Không có câu trả lời nào trong số này trả lời cho tôi trên hai phiên bản Ubuntu khác nhau. Điều làm việc cho tôi, nhưng không phải là một sửa chữa thực sự, là gói mã python của tôi trong một cuộc gọi đến rlwrap(có sẵn trong kho ubfox):

rlwrap python mycode.py


1

Bạn đã thử sử dụng một máy khách SSH khác chưa? Một số máy khách SSH có các thao tác gõ phím đặc biệt, tích hợp sẵn cho các quy trình từ xa khác nhau. Tôi chạy vào cái này rất nhiều với emacs.

Bạn đang sử dụng ứng dụng khách nào? Tôi khuyên bạn nên thử Putty và SecureCRT để so sánh hành vi của họ.


Hmm, tôi chỉ sử dụng lệnh ssh trong terminal (ssh -v nói OpenSSH_3.9p1, OpenSSL 0.9.7a ngày 19 tháng 2 năm 2003).
Frank

Hãy dùng thử Putty (miễn phí) và quay lại với chúng tôi :)
JoshJordan

Được rồi, tôi chỉ cần cài đặt putty và sử dụng nó để kết nối với máy, nhưng hành vi ở đó là như nhau.
Frank

:( Chắc chắn là một vấn đề phía máy chủ. Tôi sẽ xem xét và liên lạc lại với bạn.
JoshJordan

Sử dụng lệnh ssh để kết nối với một số máy khác hoạt động tốt: Ở đó, tôi không gặp vấn đề gì với các phím mũi tên. Nó dường như là một hệ thống đặc biệt có vấn đề.
Frank

1

mô-đun readline không được dùng nữa sẽ gây ra lỗi con trỏ không hợp lệ trong các phiên bản python mới nhất khi thực hiện thoát () hoặc exit () trong shell python. pip install gnureadlinethay thế


0

Biến env của bạn $ TERM đặt [a] khi mọi thứ hoạt động tốt và [b] khi chúng không hoạt động? Cài đặt Env thường là chìa khóa cho các vấn đề như vậy.


1
Tôi vừa thử một số giá trị biến TERM: vt102, vt220, ansi, xterm, nhưng không có giá trị nào thay đổi hành vi.
Frank

0

Hãy thử lấy một thư viện mã khóa đang chạy trên máy chủ. Nếu điều đó không làm việc, hãy thử tải xuống một thư viện với khả năng đọc khóa.


0

Tôi đã thử xây dựng Python 2.7 trên Ubuntu 14.0. Bạn sẽ cần libreadline-dev. Tuy nhiên, nếu bạn lấy nó từ apt-get, phiên bản hiện tại là 6.3, không tương thích với Python 2.7 (không chắc chắn về Python 3). Ví dụ: kiểu dữ liệu "Chức năng" và "CPPFunction", được xác định trong các phiên bản trước của đường đọc đã bị xóa trong 6.3, như được báo cáo ở đây:

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

Điều đó có nghĩa là bạn cần lấy mã nguồn của phiên bản đọc trước đó. Tôi đã cài đặt libreadline 5.2 từ apt-get cho thư viện và lấy mã nguồn 5.2 cho các tệp tiêu đề. Đặt chúng trong / usr / bao gồm.

Cuối cùng vấn đề đã được giải quyết.


0

Trên MacOsx, tôi đã sửa lỗi này bằng cách cài đặt lại đường dẫn

brew reinstall readline
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.