2020/05/03 今日したこと

いろいろとあって Ubuntu 20.04 にアップグレードした、いろいろとセットアップをしている。

Poetry のインストーラではインストールがうまくできない#

回避策はひどく簡単なんだけど、ちょっと困った事態が起きている。Poetry の公式インストーラで Poetry をインストールするのだけど、Ubuntu 20.04 は python コマンドがデフォルトでは入っていない。詳しいことは忘れたんだけど、python コマンドはたとえ EOL になっても Python2 をさすべきで、Python3 を使うときは python3 コマンドを使う、みたいな方針があったと思う。詳しいことがぱっと思い出せないが、PEP で規定されているのかもしれない。

なので python コマンドはないが python3 コマンドがあることに個人的には違和感を感じなかったのだけど、そのせいで Poetry の shebang が死んでる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import glob
import sys
import os

lib = os.path.normpath(os.path.join(os.path.realpath(__file__), "../..", "lib"))
vendors = os.path.join(lib, "poetry", "_vendor")
current_vendors = os.path.join(
    vendors, "py{}".format(".".join(str(v) for v in sys.version_info[:2]))
)
sys.path.insert(0, lib)
sys.path.insert(0, current_vendors)

if __name__ == "__main__":
    from poetry.console import main

    main()

となっているため、なんと envpython コマンドなんてないよ〜と言ってしまうのである。たしかに俺もデフォルトで python コマンドが存在しない Linux ディストリビューションが存在することになるなんて思ってもみなかった。

ちなみにわたしは面倒だったので、shebang を python から python3 に変えた。たぶん普通に動く。少なくとも今の所普通に動いている。

そういえば macOS でも Python とかがデフォルトでは入らないという未来がありえる。さすがに Poetry を使う人は自分で Python を入れるだろうからそこまで気にしなくていい気もするけど1

追記: 再現手順#

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3
source $HOME/.poetry/env
poetry

なお、Python3 でインストールしたんだから Python3 で動作させるべきよね?というか、より一般にインストールに利用した Python で動作させるべきよね、という議論はすでにあって、たとえば python-poetry/poetry #721 とか、python-poetry/poetry #1518 とかで議論されている。この問題は既知の問題が別の形で表出したにすぎない。

またまた追記#

Ubuntu 20.04 では /usr/bin/python がないというコメントを雑にしたら、 python コマンドがほしいときの対処法が Ubuntu 20.04 のリリースノートにあるよと教えてもらった。

Include installation instructions for python3 · Issue #721 · python-poetry/poetry

教えてもらったので早速リリースノートを見て試してみた。

% apt search python-is-python3
ソート中... 完了
全文検索... 完了  
python-is-python3/focal,focal 3.8.2-4 all
  symlinks /usr/bin/python to python3

% sudo apt install python-is-python3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  python-is-python3
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
2,364 B のアーカイブを取得する必要があります。
(略)
% python
Python 3.8.2 (default, Apr 27 2020, 15:53:34) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello, World!!')
Hello, World!!
>>> exit()
hikaru:~% type python
python is /bin/python

ちなみに、Python2 に依存するパッケージは Ubuntu 側で管理しているパッケージである限りは /usr/bin/python2 を使うらしい。とりあえず apt を使っている限りは安心な気がするけれど、npm とかが Python2 使うときはどうすんだろうと思わなくない。まぁそのときはそのとき考えるか。

zsh の補完関数の置き場所#

Zsh を使っているのだけど、 bash-completion のようにコマンドが提供しているカスタム補完の置き場所はどこなんだろうと調べたが、どうも決まった名前がないらしい。bash は bash-completion.d みたいな名前があったと思うんだけど。

というわけでてきとうに ~/zsh/share/completions/_${command_name} とかしておいてみて、

# load completions
fpath+="$HOME/zsh/share/completions"

autoload -Uz compinit
compinit

とか書いた。これで読み込めるようになっている。


  1. Homebrew が今までインストールスクリプトが bash に変わっているのは、macOS の方針を受けてのこと。くわしくはこちらを参照↩︎