Pythonシェルで矢印キーを押したときにエスケープ文字が表示される


191

インタラクティブなPythonシェルのようなシェルでは、通常、矢印キーを使用して現在の行を移動したり、前のコマンド(上矢印キーを使用)などを取得したりできます。

しかし、別のマシンにsshしてpythonそこから開始すると、次のようなセッションが始まります。

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

最後の文字は上向き矢印です。または、左矢印キーを使用します。

>>> impor^[[D

どうすれば修正できますか?

通常のbashでは、矢印キーは正常に機能します。奇妙な動作は、対話型のpython(またはperlなど)シェルにあります。


これはサーバー障害に属していると思います。これは、誤った端末タイプが原因です。
エポックウルフ、2009年

以下のCartmanには、端末タイプの問題ではなく、readlineの問題であることに同意します。
フランク

2
easy_install readline、easy_install ipythonはMacで完璧に動作します。
gnuyoga 2013年

anaconda2またはanaconda3をインストールし、.pystartupを設定します。リンク
Leon WANG

1
@LeonWANGは悪い答えを与えます-.pystartupファイルを機能させるためだけに、アナコンダほど大きなものをインストールしないでください。完全に不要です。
jdogg 2018年

回答:


38

readlineが有効になっていないようです。PYTHONSTARTUP変数が定義されているかどうかを確認します。私がそれを指し/etc/pythonstart、そのファイルはreadline / history処理を設定するインタラクティブになる前にPythonプロセスによって実行されます。

@chownのおかげで、ここにドキュメントがあります:http ://docs.python.org/2/tutorial/interactive.html


ありがとう、readlineが問題のように思われることに同意します。ただし、システムには/usr/lib/libreadline.so.5があります。/ etc / pythonstartはありません。
フランク

1
グーグルの後で、readline-develをインストールした後、そのシステムのpythonを再コンパイルする必要があるようです。
フランク

1
環境変数はPYTHONSTARTUPではなくPYTHONSTARTです。ディストリビューション固有の/etc/pythonstartファイルについては不明です。
Ned Deily、2011

1
実際、docs.python.org / 2 / tutorial / interactive.htmlを読むと、pystartupファイルに必要なすべての情報が得られます。
チャウン

7
OSXでbrewを使用した場合、私がしなければならなかったのはbrew reinstall python3
Ranhiru Jude Cooray 2017

102

readlineパッケージをインストールすることでこの問題を解決しました:

pip install readline

24
libncurses-devUbuntuマシンにインストールしてから、readlineを正しくインストールする必要がありました。
Amir Eldor、2015

4
インストール済みncurses-develのCentOS上で、その後readline何の問題もインストールされていません。対話型シェルが機能している。
one.time

1
yum install ncurses-devel
Alex Punnen 2016

4
pip install readline私のOS Xマシンでは実行できません。正常に実行した後でも毎回失敗しますbrew install readline
user5359531

9
gnureadline代わりにインストールする必要がありました。stackoverflow.com/ q / 43013060/2846923
帽子をかぶった男

82

OS Xでは、別の問題があります。

システムのPythonシェルを使用する場合、キーは問題ありませんが、virtualenvに問題があります。virtualenv / readlineを再インストール/アップグレードしようとしましたが、何も修正されていません。

import readline問題のあるpythonシェルを試そうとしているときに、次のエラーメッセージが表示されます。

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

何かがv6を呼び出した場合、これが実際にv7であることを認識していない場合、これは問題を引き起こしませんか?
Adam Barnes、

3
私は同じ問題を抱えていましたが、これらの指示の代わりに私はしましたbrew update && brew upgrade。このプロセスでPHPが機能しなくなったかどうかは、まだ不明です。
Adam Barnes

@AdamBarnesこれも私にとってはトリックでした。私はpyenvも使用しているので、すべての自作パッケージをアップグレードした後で、必要なpythonバージョンをアンインストール/再インストールしてください。
funseiki 2017年

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はリンクなしで正常に動作しました。
ジムジュン

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 16

3
@ user5359531 easy_installオプションで回答を更新しました
Max Malysh

また、OSX 10.12ユーザー:stackoverflow.com/questions/7375545/...
PTIM

1
easy_install私にとっては作品を使用しますが、pip を使用するものは機能しません。
ちょうど半分

1
これはbrew link readline(すでにリンクされていたとしても)組み合わせて、私のために修正しました。
Richard Rast

28

OS Xでは、python 3.5およびvirtualenvを使用

$ pip install gnureadline

インタープリターで以下を実行します。

import gnureadline

これで、矢印キーが正しく機能するはずです。


追加情報...

2015年10月1日以降、readlineは廃止されました(ソースhttps://github.com/ludwigschwardt/python-readline)。

代わりにgnureadlineを使用してください(https://github.com/ludwigschwardt/python-gnureadlineを参照)

Python 3.5を使用してgnureadlineではなくreadlineをインストールすると、インタープリターにインポートしようとするとエラーが発生します。

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

19

私はこの問題に最近pip install readline遭遇し、多くのことを読んだ後(mac osxでは機能しません)とpip install gnureadline満足していないので、これは今私のPythonコンソールで矢印キーを使用できるようにする設定です:

  1. を使用してgnureadlineをインストールする pip install gnureadline

今、あなたはどちらかを行うことができimport gnureadline、矢印キーは期待通りに機能するはずです。これらを自動的に機能させるには、次の手順に従います。

  1. ファイルを作成(または追加)します~/.startup.pyimport gnureadline
  2. ファイルに追加~/.bash_profileexport PYTHONSTARTUP=~/.startup.py

機能しませんが、以前のセットアップで機能しpdb.set_trace()たのは、でのgnureadlineの自動インポートです。誰かがこの問題の良い解決策を持っているなら、私はコメントに感謝します。


15
  1. readline-develパッケージをインストールしてください。
  2. readlineモジュールでpythonを再コンパイルします
  3. ビンゴ!

2
私の生活の質を向上させてくれてありがとう!{;-) Centos 5.5では、それはyum install readline-develであり、再コンパイルでreadlineを明示的に指定する必要はありません
michela

3
Pythonを再コンパイルするにはどうすればよいですか?ソースからpythonを抽出してインストールし(./configure、make、make install)、virtualenvをセットアップしてすべてのパッケージを再度インストールする必要がありますか?
ムハンマドワカール2013年

14

Ubuntu 16.04 LTSでPython 3.6.xのシェル履歴(tab / arrowsコマンド)に問題がありました。

Python 3.6.xがソースからインストールされました。

私のために解決したのは、次のコマンドラインを使用して、user12345が言ったように「gnureadline」モジュールをインストールすることでした。

sudo pip3.6 install gnureadline

:)


1
私は他のすべての解決策を試しましたが、これは私のPython 3.6で
うまくいきました

1
それが機能するためには必ずimport gnureadlineシェルを呼び出すようにしてください
David Schumann

3
sudoを使用する必要はありません
Newalp

11

以下は、ubuntu 12.04のpython 3.3で機能した手順です。

1)テミナルを開いて書き込む sudo apt-get install libreadline-dev

2)http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xzからpython 3.3.2のソースファイルをダウンロードします。

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

そしてpython 3.4を再コンパイルします。

OpenSUSEでは、これを修正します

pip3 install readline

ヴァレリオ・クリニーの答えに従ってください。

おそらく「pip3 install readline」が一般的な解決策です。私のCentOSを試したことはありません。


readline-develのヒントを参考にしてください。Centos6.5マシンでpython 2.7.8を鳴らして動作しました。私はpip install readlinepythonを再コンパイルせずに直接呼び出しましたが、うまくいきました。
アルジュン2015

3

私は次のようにしてこれを修正しました:

  • yum install 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、Pythonシェルのエスケープ文字を解決することに成功しました。

参考までに、私はRedHatを使用しています


CentOS 6.8、Python2.7.12、成功
kkzxak47 '21

3

Anaconda Pythonを使用している場合は、次のコマンドを実行してこれを修正できます。

conda install readline

私のために働いた!


2
私の場合、readlineはすでにインストールされていますconda install ncurses。それを機能させるために実行する必要があります。
whenov

3

condaを使用している場合は、conda-forgeチャネルからreadlineパッケージをインストールすると問題が解決します。

conda install -c conda-forge readline=6.2

2

-tパラメータを指定してsshを呼び出し、sshに仮想端末を割り当てるように指示しましたか?

manページから:

-t
疑似tty割り当てを強制します。これは、リモートサービスマシン上で任意の画面ベースのプログラムを実行するために使用できます。これは、たとえばメニューサービスの実装時に非常に役立ちます。複数の-tオプションは、sshにローカルttyがない場合でも、tty割り当てを強制します。

さらに、別の投稿で提案されているように、サーバーのTERM環境変数を正しく設定する必要がある場合もあります。


2

Mac OS X Mojave 10.14.6では、さまざまな履歴インストールがあり、次のようbrewにして解決しました。

brew reinstall python2

誰もが異なるインストールシナリオを持っていることを考えれば、魔法の弾丸はおそらくありません。私も上記を試しましたので、いくつかの答えの組み合わせであった可能性があります。Brewはデフォルトでpython3python2パッケージをインストールした場合は再インストールする必要があります。


2

Ubuntuの2つの異なるバージョンでは、これらの回答のどれも私にとってうまくいきませんでした。私にとってはうまくいきましたが、本当の修正ではありませんが、Pythonコードをへの呼び出しでラップしていますrlwrap(ubuntuリポジトリで利用可能):

rlwrap python mycode.py


1

別のSSHクライアントを使用してみましたか?一部のSSHクライアントには、さまざまなリモートプロセス用の特別な組み込みのキーマッピングがあります。私はemacsでこれによく遭遇しました。

どのクライアントを使用していますか?PuttyとSecureCRTの動作を比較することをお勧めします。


うーん、私はターミナルでsshコマンドを使用するだけです(ssh -vはOpenSSH_3.9p1、OpenSSL 0.9.7a 2003年2月19日と言います)。
フランク

Putty(無料)を試して、私たちに戻ってください:)
JoshJordan 2009年

さて、パテをインストールし、マシンに接続するために使用しましたが、動作は同じです。
フランク

:(間違いなくサーバー側の問題を、私はそれに見て、あなたに戻って取得します。。
JoshJordan

sshコマンドを使用して他のマシンに接続すると問題なく動作します。そこで、矢印キーに問題はありません。問題のある特定のシステムのようです。
フランク

1

readlineモジュールは非推奨になりました。Pythonシェルでquit()またはexit()を実行すると、最新のpythonバージョンで無効なポインターエラーが発生します。 pip install gnureadline代わりに


0

環境変数$ TERMは、[a]正常に機能する場合と[b]機能しない場合にどのように設定されますか?多くの場合、環境設定はそのような問題の鍵となります。


1
私はいくつかのTERM変数値を試してみました:vt102、vt220、ansi、xterm、しかしそれらのどれも動作を変更しませんでした。
フランク

0

サーバーで実行されているキーコードライブラリを取得してみてください。それが機能しない場合は、読み取りキー機能を持つライブラリをダウンロードしてみてください。


0

Ubuntu 14.0でPython 2.7をビルドしようとしていました。libreadline-devが必要です。ただし、apt-getから取得した場合、現在のバージョンは6.3であり、Python 2.7(Python 3については不明)と互換性がありません。たとえば、以前のバージョンのreadlineで定義されていた「関数」と「CPPFunction」のデータ型は、6.3で削除されました。

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

つまり、以前のバージョンのreadlineのソースコードを入手する必要があります。ライブラリのapt-getからlibreadline 5.2をインストールし、ヘッダーファイルの5.2のソースコードを取得しました。それらを/ usr / includeに置きます。

最後に問題が解決されました。


0

MacOsxでは、readlineを再インストールしてこれを修正しました

brew reinstall readline
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.