M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

MacPortsのPythonパッケージでコマンドラインの入力が表示されなくなる件・・・

例によってハマった話です。ただ今回は思いもかけないところで穴に落ちました。事象としてはおおよそ次のようなもの:

  1. MacPortsでインストールしたSphinxsphinx-quickstartコマンドを実行したら、同コマンドからユーザに対して各種オプションの値の入力を求めるメッセージ(=readlineのメッセージ)がターミナル上表示されず、何かを入力した後deleteキーで入力を取り消すと表示される。
  2. sphinx-quickstartコマンドが完了した後、今度はキーボードから入力した内容がターミナルに表示されなくなる(入力したコマンドの出力は表示される)。
  3. 新しいターミナルのウィンドウを開くとそちらでは事象が解消しているが、そこでsphinx-quickstartコマンドを実行するとやはり同じ事象になる。

調べたところQiitaに先達の記事があり、MacPortsPythonパッケージに問題がある模様。対症療法として「事象発生後、stty saneコマンドを実行する」というものが紹介されていました。これを実行するとたしかにターミナルのウィンドウを開き直さなくても事象が解決します。ただしsphinx-quickstartコマンドを実行するとまた同じ事象に遭遇します。

そこでこのQiita記事からリンクされているsuperuser.com(stackoverflowの姉妹サイト)のQAエントリー"OS-X terminal behaves oddly after running Python interactively"(Pythonを対話モードで実行したあとmacOSのターミナルの挙動がおかしくなる)という記事を参照したところ、MacPorts+readlineバリアント指定付きでPythonをインストールするとこの事象に対処できるとのこと。私の端末でMacPorts経由でインストールしていたPythonはバージョン2.7でしたので、さっそくsudo port install python27 +readlineコマンドを実行してみました:

$ sudo port install python27 +readline
Password:
--->  Computing dependencies for python27
--->  Fetching archive for python27
--->  Attempting to fetch python27-2.7.12_2+readline.darwin_16.x86_64.tbz2 from https://packages.macports.org/python27
--->  Attempting to fetch python27-2.7.12_2+readline.darwin_16.x86_64.tbz2 from http://lil.fr.packages.macports.org/python27
--->  Attempting to fetch python27-2.7.12_2+readline.darwin_16.x86_64.tbz2 from http://fco.it.packages.macports.org/mirrors/macports-packages/python27/python27
--->  Fetching distfiles for python27
--->  Attempting to fetch Python-2.7.12.tar.xz from http://jog.id.distfiles.macports.org/macports/distfiles/python27
--->  Verifying checksums for python27                                          
--->  Extracting python27
--->  Applying patches to python27
--->  Configuring python27
--->  Building python27
--->  Staging python27 into destroot
--->  Installing python27 @2.7.12_2+readline
--->  Deactivating python27 @2.7.12_2
--->  Cleaning python27
--->  Activating python27 @2.7.12_2+readline

To make this the default Python or Python 2 (i.e., the version run by the
'python' or 'python2' commands), run one or both of:

    sudo port select --set python python27
    sudo port select --set python2 python27

##############################################################
# IF YOU ARE USING PYTHON FROM THE TERMINAL, PLEASE INSTALL:
#   py27-readline
# TO AVOID A LIBEDIT / PYTHON INTERACTION ISSUE.
# REF: https://trac.macports.org/ticket/48807
##############################################################

--->  Cleaning python27
--->  Updating database of binaries
--->  Scanning binaries for linking errors               
--->  No broken files found.

再インストールのあとでsphinx-quickstartコマンドを実行してみるとたしかに事象が治っています。いえ、正確にいうとsphinx-quickstartコマンド自体の挙動はまだ若干おかしい部分がある(readlineのメッセージが表示されたあとのキャレット位置がメッセージの文頭にかぶる、deleteキーを押した時メッセージが消えてしまう、など)のですが、Pythonの再インストール前の「今何を質問されているのかすらわからない」というようなどうしようもない状態ではなくなりました。もちろんコマンド実行の後ターミナルの挙動は正常です。

いやはや、Sphinx自体で何か起こるならともかくまさかPythonインタープリタそのものの(パッケージの)バグにハマるとは思っていませんでした。。。