nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

Windows10にWSLでUbuntuを入れてもpyenvが使えなかった時の話

前前回、前回と、Windows 10上でUbuntuを動かす上で、Proxyの設定が重要であることを学んで来た。
koideforest.hatenadiary.com
koideforest.hatenadiary.com

git cloneが使えるところまで来たため、pyenvをインストールしたところ、pyenv installがコケてしまった。
オプション-vを付けた

pyenv install 2.7.16 -v

で、詳しく見たところ、

/tmp/python-build.20190607182209.328 ~/.pyenv
Downloading Python-2.7.16.tar.xz...
-> https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xz
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to XXX.XX.XX.XX:xxxx
error: failed to download Python-2.7.16.tar.xz

BUILD FAILED (Ubuntu 18.04 using python-build 1.2.11-12-g2350e57b)

となり、どうやらcurlが悪さをしている様子。

このエラーメッセージが厄介だった。
OpenSSLが悪いんだなと思ったり、Proxyの設定がまた悪いんだろうなと思って.curlrcを設定したり、と試行錯誤したが、上手く行かなかった。

ネットを見ると、wgetは上手く行かないがcurlなら上手く行くという記事が見受けられた。
試しにwgetPythonパッケージをダウンロードをすると上手く行った。
一方、curlでは、

curl -v https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz

結果の最後だけ抜き出すと、

Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
* Failed writing body (0 != 2750)
* Connection #0 to host 133.63.21.99 left intact

となって、手元に何も残らなかった。ネットの情報とは逆の症状が起きていて、何か変だなと思った。
警告文の意味が最初はよくわからなかったが、curlについてググってみると、どうもcurlはURL先のデータを標準出力するのが基本動作のようで、「ファイルとして残したかったらオプションを付けろ」ということだと理解した。

つまり、pyenvがcurlでパッケージを取るためには、オプションをpyenvのソースに書き足す必要がある(と、この時点では思った)。
curlを呼んでいるのは、

$PYENV_ROOT/python-build/bin/python-build

で、これはbashファイルである。
中身を見てみると、変数をいろいろ使っているのでややこしく感じた。
なので、結局、wgetは上手く行っているのだから、wgetを使わせるようにしようと方向転換し、

detect_http_client() {
  local client
  #for client in aria2c curl wget; do
  for client in aria2c wget curl; do
    if type "$client" &>/dev/null; then
      echo "$client"
      return
    fi
  done
  echo "error: please install \`aria2c\`, \`curl\`, or \`wget\` and try again" >&2
  return 1
}

のように、curlwgetの順番を入れ替えて、wgetが優先されるようにした(aria2cはインストールしていないので、内部で無視されている)。

この変更で、何とかpyenvからpythonをインストールすることが出来るようになった。