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()
となっているため、なんと env
が python
コマンドなんてないよ〜と言ってしまうのである。たしかに俺もデフォルトで 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
とか書いた。これで読み込めるようになっている。