前前回、前回と、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なら上手く行くという記事が見受けられた。
試しにwgetでPythonパッケージをダウンロードをすると上手く行った。
一方、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 }
のように、curlとwgetの順番を入れ替えて、wgetが優先されるようにした(aria2cはインストールしていないので、内部で無視されている)。
この変更で、何とかpyenvからpythonをインストールすることが出来るようになった。