เห็นตัวละครในการหลบหนีเมื่อกดปุ่มลูกศรในเปลือกหลาม


191

ในเชลล์เช่นเชลล์ Python แบบโต้ตอบโดยปกติคุณสามารถใช้ปุ่มลูกศรเพื่อเลื่อนไปมาในบรรทัดปัจจุบันหรือรับคำสั่งก่อนหน้า (พร้อมลูกศรขึ้น) เป็นต้น

แต่หลังจากที่ฉันไปที่เครื่องอื่นและเริ่มต้นที่pythonนั่นฉันได้รับเซสชันเช่น:

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

อักขระตัวสุดท้ายมาจากลูกศรขึ้น หรือใช้ลูกศรซ้าย:

>>> impor^[[D

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

ในการทุบตีปกติปุ่มลูกศรทำงานได้ดี พฤติกรรมแปลก ๆ นั้นอยู่ในเปลือกของหลาม (หรือเพิร์ลเป็นต้น) แบบโต้ตอบ


ฉันคิดว่านี่เป็นความผิดพลาดของเซิร์ฟเวอร์ สิ่งนี้เกิดจากประเภทอาคารที่ไม่ถูกต้อง
epochwolf

ฉันเห็นด้วยกับ cartman ด้านล่างว่าเป็นปัญหา readline ไม่ใช่ปัญหาประเภทเทอร์มินัล
Frank

2
easy_install readline จากนั้น easy_install ipython ทำงานได้สมบูรณ์แบบใน mac
gnuyoga

ติดตั้ง anaconda2 หรือ anaconda3 และตั้งค่า. pystartup โปรดดูลิงค์
Leon

1
@LeonWANG ให้คำตอบที่ไม่ดี - อย่าติดตั้งอะไรที่มีขนาดใหญ่พอ ๆ กับอนาคอนดาเพื่อให้ไฟล์. pstartup ของคุณทำงานได้ ไม่จำเป็นโดยสิ้นเชิง
jdogg

คำตอบ:


38

ดูเหมือนว่าไม่ได้เปิดใช้งาน readline ตรวจสอบว่าPYTHONSTARTUPมีการกำหนดตัวแปรหรือไม่สำหรับฉันมันชี้ไปที่/etc/pythonstartและไฟล์นั้นจะถูกดำเนินการโดยกระบวนการหลามก่อนที่จะโต้ตอบซึ่งตั้งค่าการจัดการ readline / ประวัติ

ขอบคุณ @chown ที่นี่เป็นเอกสารเกี่ยวกับเรื่องนี้: http://docs.python.org/2/tutorial/interactive.html


ขอบคุณฉันยอมรับว่า readline น่าจะเป็นปัญหา ระบบจะมี /usr/lib/libreadline.so.5 ไม่มี / etc / pythonstart
Frank

1
หลังจาก googling แล้วดูเหมือนว่า python บนระบบนั้นอาจจะต้องคอมไพล์ใหม่หลังจากติดตั้ง readline-devel
Frank

1
ตัวแปรสภาพแวดล้อมที่ไม่PYTHONSTARTUP PYTHONSTARTไม่แน่ใจเกี่ยวกับ/etc/pythonstartไฟล์เฉพาะการกระจาย
Ned Deily

1
ที่จริงแล้วการอ่านdocs.python.org/2/tutorial/interactive.htmlให้ข้อมูลทั้งหมดที่จำเป็นสำหรับไฟล์ pystartup
chown

7
บน OSX ด้วยการชงสิ่งที่ฉันต้องทำคือbrew reinstall python3
Ranhiru Jude Cooray

102

ฉันได้แก้ไขปัญหานี้โดยการติดตั้งreadlineแพคเกจ:

pip install readline

24
ฉันต้องติดตั้งlibncurses-devบนเครื่อง Ubuntu ของฉันจากนั้น readline ติดตั้งอย่างถูกต้อง
Amir Eldor

4
ติดตั้งncurses-develบน CentOS แล้วreadlineติดตั้งไม่มีปัญหา เชลล์แบบโต้ตอบทำงานได้ในขณะนี้
one.time

1
yum install ncurses-devel
Alex Punnen

4
ไม่สามารถใช้pip install readlineกับเครื่อง OS X ของฉันล้มเหลวทุกครั้งแม้หลังจากทำสำเร็จbrew install readline
user5359531

10
ฉันต้องติดตั้งgnureadlineแทนดูstackoverflow.com/q/43013060/2846923
The Guy with The Hat

82

ใน OS X ฉันมีปัญหาแตกต่างกัน

เมื่อฉันใช้ system python shell คีย์ไม่มีปัญหา แต่เป็นปัญหาใน virtualenv ฉันพยายามติดตั้ง / อัพเกรด virtualenv / readline และไม่มีอะไรคงที่

ในขณะที่ฉันพยายามที่จะimport readlineประสบปัญหาเปลือกหลามได้รับข้อความแสดงข้อผิดพลาดนี้:

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

เพราะมี/usr/local/opt/readline/lib/libreadline.7.dylibแต่ไม่มีlibreadline.6.dylibดังนั้นฉันจึงสร้างลิงก์สัญลักษณ์:

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

ปัญหาได้รับการแก้ไขแล้ว!


หลังจากดูแล้วฉันก็สามารถแก้ไขปัญหาได้ด้วยคำแนะนำนี้ ขอบคุณ!
gl051

นี่จะไม่ทำให้เกิดปัญหาหากมีสิ่งที่เรียก v6 โดยที่ไม่ทราบว่าเป็น v7 จริงหรือ
Adam Barnes

3
ฉันมีปัญหาเดียวกัน brew update && brew upgradeแต่แทนที่จะคำแนะนำเหล่านี้ที่ผมทำ ไม่ว่าจะเป็นสิ่งที่ PHP แตกในกระบวนการยังคงเป็นที่จะเห็น
Adam Barnes

@ อดัมบาร์นส์นี่ก็ใช้กลอุบายของฉันเช่นกัน ฉันใช้ pyenv ด้วยดังนั้นโปรดถอนการติดตั้ง / ติดตั้ง python เวอร์ชั่นที่ฉันต้องการหลังจากอัพเกรดแพ็คเกจ homebrew ทั้งหมด
funseiki

3
ฉันไม่มี libreadline.7.dylib (อาจเป็นเพราะฉันใช้งาน Mojave 10.14.x แล้วอัปเดต XCode 10.2.1) แต่มี ver 8 แทน การดำเนินการln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylibแก้ไขปัญหาของรหัสสแกน แต่ไม่นำการเรียกคืนคำสั่งประวัติกลับมา แม้ว่าในกรณีนี้การแก้ไขครึ่งหนึ่งจะดีกว่าไม่มีเลย (ใช่ฉันยังเพิ่มลิงค์สำหรับ 6 ไม่แตกต่างกัน) ภาคผนวก: นี่เป็น / เป็นปัญหาของ python2 เท่านั้นสำหรับฉัน python3 ทำงานได้ดีโดยไม่มีลิงก์
Zim

51

บน OS X บางครั้งการอัปเดตของ Xcode อาจreadlineไม่สมบูรณ์ สารละลาย:

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

หากปัญหายังคงมีอยู่ให้ลองลบreadlineโดยใช้pipและติดตั้งโดยใช้easy_install:

pip3 uninstall readline
easy_install readline

มีอะไรเทียบเท่าถ้าคุณใช้ระบบ Python 2.7.10?
user5359531

3
@ user5359531 ฉันได้อัปเดตคำตอบพร้อมeasy_installตัวเลือกแล้ว
Max Malysh

ผู้ใช้ OSX 10.12 คน: stackoverflow.com/questions/7375545/…
ptim

1
การใช้easy_installงานได้สำหรับฉันในขณะที่การใช้ pip ไม่ทำงาน
justhalf

1
สิ่งนี้รวมกับbrew link readline(แม้ว่ามันจะเชื่อมโยงไปแล้ว) ก็ได้แก้ไขให้ฉัน
Richard Rast

28

บน OS X ใช้ python 3.5 และ virtualenv

$ pip install gnureadline

ในล่ามทำ:

import gnureadline

ตอนนี้ปุ่มลูกศรควรทำงานอย่างถูกต้อง


ข้อมูลเพิ่มเติม...

โปรดทราบว่า ณ วันที่ 1 ต.ค. 2558 - readline ถูกเลิกใช้งาน (แหล่งhttps://github.com/ludwigschwardt/python-readline )

ใช้gnureadlineแทน (ดู: https://github.com/ludwigschwardt/python-gnureadline )

ถ้าฉันติดตั้ง readline แทน gnureadline โดยใช้ python 3.5 ฉันได้รับข้อผิดพลาดหลังจากพยายามนำเข้าในล่าม:

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

ใช้งานได้แต่มันหมายความว่าฉันต้องเพิ่มimport gnureadlineที่ด้านบนของทุกเซสชันแบบโต้ตอบซึ่งน่ารำคาญจริงๆ มีวิธีที่จะเริ่มต้นนี้ในตอนต้นของทุกเซสชั่นแบบโต้ตอบหรือไม่?
รหัสแอนตัน

1
@Panchishin ลองใช้ตัวแปรสภาพแวดล้อมPYTHONSTARTUPเพื่อตั้งชื่อไฟล์ที่มีคำสั่ง Python ดำเนินการก่อนที่จะแสดงข้อความโต้ตอบ (เช่นimport gnureadline) สำหรับแนวคิดอื่น ๆ ที่เป็นไปได้โปรดดูที่: เรียกใช้ตัวแปลบรรทัดคำสั่งของ python พร้อมการนำเข้าที่โหลดโดยอัตโนมัติ
user12345

20

ฉันได้พบปัญหานี้เมื่อเร็ว ๆ นี้และหลังจากอ่านมากเกี่ยวกับpip install readline(ไม่ทำงานสำหรับ mac osx) pip install gnureadlineและไม่พอใจนี่คือตอนนี้การตั้งค่าของฉันซึ่งช่วยให้การใช้ปุ่มลูกศรในคอนโซลหลามใด ๆ :

  1. ติดตั้ง gnureadline โดยใช้ pip install gnureadline

ตอนนี้คุณสามารถทำได้import gnureadlineและปุ่มลูกศรควรทำงานตามที่คาดไว้ ในการทำให้ทำงานโดยอัตโนมัติให้ทำตามขั้นตอนต่อไปนี้:

  1. สร้างไฟล์ (หรือต่อท้าย) ~/.startup.py:import gnureadline
  2. ต่อท้ายไฟล์~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

สิ่งหนึ่งที่ใช้งานไม่ได้ แต่ทำในการตั้งค่าก่อนหน้าของฉันคือ: เปิดการนำเข้า gnureadline pdb.set_trace()อัตโนมัติ หากใครมีทางออกที่ดีในการแก้ไขปัญหานี้ฉันจะขอบคุณสำหรับความคิดเห็น


15
  1. ติดตั้งแพ็คเกจ readline-devel
  2. recompile python พร้อมโมดูล readline
  3. บิงโก!

2
ขอบคุณสำหรับการปรับปรุงคุณภาพชีวิตของฉัน! {;-) สำหรับ Centos 5.5 นั่นคือ yum install readline-devel และคุณไม่จำเป็นต้องระบุ readline ในการคอมไพล์
ซ้ำ

3
เราจะคอมไพล์ Python ใหม่ได้อย่างไร? ฉันต้องติดตั้ง python แยกจากแหล่งที่มา (./configure ทำติดตั้ง) ตั้งค่า virtualenv และติดตั้งแพ็คเกจทั้งหมดของฉันอีกครั้งหรือไม่
มูฮัมหมัด Waqar

14

ฉันมีปัญหากับประวัติเชลล์ (คำสั่งแท็บ / ลูกศร) ของ Python 3.6.x บน Ubuntu 16.04 LTS

ติดตั้ง Python 3.6.x จากแหล่งที่มา

สิ่งที่แก้ไขให้ฉันคือติดตั้งโมดูล "gnureadline" ตามที่กล่าวโดย user12345 โดยใช้บรรทัดคำสั่งนี้:

sudo pip3.6 install gnureadline

:)


1
ฉันลองใช้วิธีแก้ไขปัญหาอื่น ๆ ทั้งหมด แต่อันนี้ใช้ได้สำหรับฉันสำหรับ Python 3.6 ของฉัน
Umair

1
ให้แน่ใจว่าได้โทรเข้ามาimport gnureadlineในเปลือกเพื่อให้มันใช้งานได้
David Schumann

3
ไม่จำเป็นต้องใช้ sudo
Newalp

11

นี่คือขั้นตอนที่ใช้ได้สำหรับฉันใน Ubuntu 12.04 สำหรับ python 3.3

1) เปิด teminal และเขียน sudo apt-get install libreadline-dev

2) ดาวน์โหลดไฟล์ต้นฉบับของ python 3.3.2 จาก http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

3) แตกไฟล์และนำทางไปยังไดเรกทอรี Python-3.3.2 / ในเชลล์

4) รันคำสั่งต่อไปนี้:

./configure
make
make test
sudo make install

7

ได้รับผลกระทบหลังจากอัปเกรด Mac เป็น High Sierra มันประสบความสำเร็จในการแก้ไขสำหรับฉัน:

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

5

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

yum install readline-devel

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

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

pip3 install readline

ทำตามคำตอบของ Valerio Crini

บางที "การติดตั้ง readline pip3" เป็นวิธีแก้ปัญหาทั่วไป ยังไม่ได้ลอง CentOS ของฉัน


การโทรที่ดีพร้อมด้วยคำแนะนำ readline-devel มันใช้งานได้สำหรับฉันบนเครื่อง Centos6.5 ซึ่งมี Rumming Python 2.7.8 ฉันโทรโดยตรงpip install readlineโดยไม่ต้องคอมไพล์ไพ ธ อนซ้ำและมันก็ใช้ได้ดี
Arjun

3

ฉันแก้ไขสิ่งนี้โดยทำสิ่งต่อไปนี้:

  • ยำติดตั้ง readline-devel
  • pip readline การติดตั้ง

    • ฉันพบข้อผิดพลาดอื่นที่นี่:

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

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

      ฉันแก้ไขสิ่งนี้โดยการติดตั้งpatch:

      yum install patch

หลังจากนั้นฉันก็วิ่งได้ pip install readlineสำเร็จซึ่งแก้ไขอักขระตัวหลีกเลี่ยงในเปลือกงูหลามของฉัน

FYI ฉันใช้ RedHat


CentOS 6.8, Python2.7.12, สำเร็จ
kkzxak47

3

หากคุณใช้ Anaconda Python คุณสามารถแก้ไขได้โดยการเรียกใช้:

conda install readline

ทำงานให้ฉัน!


2
ในกรณีของฉันreadlineติดตั้งแล้วฉันต้องทำconda install ncursesเพื่อให้มันใช้งานได้
พฤศจิกายน


3

คำตอบเหล่านี้ไม่เหมาะกับฉันใน Ubuntu สองรุ่นที่แตกต่างกัน สิ่งที่ใช้ได้ผลสำหรับฉัน แต่ไม่ใช่การแก้ไขที่แท้จริงคือการห่อรหัสหลามของฉันไว้ในการโทรrlwrap(มีให้ในที่เก็บของ Ubuntu):

rlwrap python mycode.py


2

คุณเรียก ssh ด้วยพารามิเตอร์-tเพื่อบอก ssh ให้จัดสรรเทอร์มินัลเสมือนให้คุณหรือไม่?

จากหน้าคน:

-t
Force การจัดสรรหลอก tty สิ่งนี้สามารถใช้เพื่อรันโปรแกรมบนหน้าจอโดยพลการบนเครื่องระยะไกลซึ่งมีประโยชน์มากเช่นเมื่อใช้งานบริการเมนู อ็อพชัน -t หลายตัวบังคับให้จัดสรร tty แม้ว่า ssh จะไม่มี tty โลคัล

นอกจากนี้คุณอาจต้องตั้งค่าตัวแปรสภาพแวดล้อมTERMบนเซิร์ฟเวอร์อย่างถูกต้องตามที่แนะนำในโพสต์อื่น


2

บน Mac OS X Mojave 10.14.6 ด้วยการติดตั้งในอดีตที่หลากหลายผ่านbrewฉันแก้ไขได้ด้วย:

brew reinstall python2

ดูเหมือนว่าจะไม่มีกระสุนวิเศษให้ทุกคนมีสถานการณ์การติดตั้งที่แตกต่างกัน ฉันลองข้างต้นด้วยเช่นกันดังนั้นมันอาจเป็นการรวมกันของคำตอบสองสามข้อ ตั้งค่าเริ่มต้นเป็น Brew python3ดังนั้นหากคุณติดตั้งpython2แพคเกจจะต้องมีการติดตั้งใหม่


1

คุณลองใช้ไคลเอ็นต์ SSH อื่นหรือไม่? ไคลเอ็นต์ SSH บางตัวมีการแมปคีย์พิเศษในตัวสำหรับกระบวนการรีโมตที่แตกต่างกัน ฉันวิ่งเข้าไปในนี้ด้วย emacs

คุณใช้ไคลเอ็นต์อะไร ฉันขอแนะนำให้ลอง Putty และ SecureCRT เพื่อเปรียบเทียบพฤติกรรมของพวกเขา


อืมฉันเพิ่งใช้คำสั่ง ssh ในเทอร์มินัล (ssh -v พูดว่า OpenSSH_3.9p1, OpenSSL 0.9.7a 19 ก.พ. 2003)
Frank

ลองใช้สีโป๊ว (ฟรี) และได้รับกลับมาให้เรา :)
JoshJordan

โอเคฉันเพิ่งติดตั้งผงสำหรับอุดรูและใช้เพื่อเชื่อมต่อกับเครื่อง แต่พฤติกรรมที่เหมือนกัน
Frank

:( แน่นอนปัญหาด้านเซิร์ฟเวอร์แล้วฉันจะดูเป็นมันและได้รับกลับมาให้คุณ..
JoshJordan

การใช้คำสั่ง ssh เพื่อเชื่อมต่อกับเครื่องอื่นทำได้ดี: ที่นั่นฉันไม่มีปัญหากับปุ่มลูกศร ดูเหมือนว่าเป็นระบบหนึ่งที่มีปัญหา
Frank

1

โมดูล readline เลิกใช้งานแล้วซึ่งจะทำให้เกิดข้อผิดพลาดของตัวชี้ที่ไม่ถูกต้องในหลามเวอร์ชันล่าสุดเมื่อเรียกใช้ exit () หรือ exit () ใน python shell pip install gnureadlineแทน


0

ตัวแปร env $ TERM ของคุณตั้งค่า [a] อย่างไรเมื่อสิ่งต่าง ๆ ทำงานได้ดีและ [b] เมื่อไม่มี การตั้งค่า Env มักเป็นกุญแจสู่ปัญหาดังกล่าว


1
ฉันลองใช้ค่าตัวแปร TERM: vt102, vt220, ansi, xterm แต่ไม่มีการเปลี่ยนแปลงพฤติกรรมใด ๆ
Frank

0

ลองเรียกใช้ไลบรารีรหัสคีย์บนเซิร์ฟเวอร์ หากวิธีนี้ใช้ไม่ได้ให้ลองดาวน์โหลดไลบรารีที่มีความสามารถในการอ่านคีย์


0

ฉันพยายามสร้าง Python 2.7 บน Ubuntu 14.0 คุณจะต้องใช้ libreadline-dev อย่างไรก็ตามหากคุณได้รับจาก apt-get เวอร์ชันปัจจุบันคือ 6.3 ซึ่งไม่สามารถใช้กับ Python 2.7 (ไม่แน่ใจเกี่ยวกับ Python 3) ตัวอย่างเช่นชนิดข้อมูล "ฟังก์ชั่น" และ "CPPFunction" ซึ่งกำหนดไว้ใน readline รุ่นก่อนหน้านี้ถูกลบใน 6.3 ตามที่รายงานที่นี่:

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

กล่าวคือคุณต้องได้รับซอร์สโค้ดของ readline รุ่นก่อนหน้า ฉันติดตั้ง libreadline 5.2 จาก apt-get สำหรับไลบรารีและรับซอร์สโค้ด 5.2 สำหรับไฟล์ส่วนหัว วางไว้ใน / usr / include

ในที่สุดปัญหาได้รับการแก้ไข


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