devel/py-readline について

問題

pkgsrc(7)からlang/python36パッケージをインストールしインタプリタを起動しても、 Bashのような行編集(Line Editing)やヒストリ置換(History Substitution)が機能しない。 たとえば、下記はインタプリタ上で1 + 1を再参照(Ctrl-p)しようとしたが ^Pが印字されてしまった場面だ。

$ python3.6
Python 3.6.5 (default, Apr 30 2018, 08:59:43)
[GCC 4.8.5] on netbsd7
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 + 1
2
>>> ^P

行編集やヒストリ置換はGNU Readlineライブラリ1によって実装されており、 Pythonオリジナルの機能ではない2

Pythonインタプリタで対話入力編集をするには、 pkgsrcのdevel/py-readlineパッケージをインストールする。 しかしこのパッケージは、pkgsrc(7)のPython標準バージョンを対象とする。 2018年4月30日時点のpkgsrc-2018Q1では、Python標準バージョンは2.7となっている。 つまり、そのままmake installしてもPython-2.7のインタプリタを対象とした devel/py-readlineパッケージがビルドされてしまう。

解決方法

任意のバージョン向けのdevel/py-readlineパッケージを作るには、 MakefileのマクロPYTHON_VERSION_DEFAULTの値にバージョンを指定してビルドする。 PYTHON_VERSION_DEFAULTへどのバージョンを指定できるか?は pkgsrc/lang/pyhon/pyversion.mkを参照すれば分かる。

# $NetBSD: pyversion.mk,v 1.123 2017/01/01 14:34:26 adam Exp $

# This file determines which Python version is used as a dependency for
# a package.
#
# === User-settable variables ===
#
# PYTHON_VERSION_DEFAULT
#   The preferred Python version to use.
#
#   Possible values: 27 34 35 36
#   Default: 27

pkgsrc-2018Q1では34、35、36が指定できる。 したがって、Python-3.6向けのdevel/py-readlineパッケージをビルドするには

# cd /usr/pkgsrc/devel/py-readline
# make PYTHON_VERSION_DEFAULT=36 install clean clean-depends

とする3。結果、py36-readline-3.6.5パッケージがインストールされる。


  1. The GNU Readline Library 

  2. 13. 対話入力編集とヒストリ置換 

  3. make(1)ではmakeコマンドにマクロを引き渡して実行できるため、pkgsrc(7)中の何らかのMakefileを編集する必要はない。