pythonbrew のインストールがこける件

2011/05/04 追記

utahtaさんが治してくれたみたいで、もう普通にインストールできます。
utahtaさんありがとうございました。


pythonのバージョン管理をするのに、ちょうど良いとおもって、見つけたのがpythonbrew。

Pythonのバージョンを管理するツール、pythonbrewを作ってみた - utahta's memo

とても良いなーとおもってありがたく使わせてもらおうと思ったのですが、なぜかインストールできなくてはまったのでメモっておく。

curl -kLO https://github.com/utahta/pythonbrew/raw/master/pythonbrew-install
export PYTHONBREW_ROOT=/usr/local/pythonbrew
sh ./pythonbrew-install

まずこんな感じでインストールしようとしたら、下記のようなエラーが出た。

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました

なんか、gzipフォーマットじゃないとか怒られる。あぁそっか、ファイルが存在しないとか、gzipが巧くいってないのかとか思う。

なので、上でDLしたpython-installの中身をのぞく、どうやら「stable-version.txt」から最新バージョン番号をもってきて、それをもとに、pypiに乗っかってるtar.gzファイルをDLしようとしているらしい。

STABLE_VERSION=`curl -skL https://github.com/utahta/pythonbrew/raw/master/stable-version.txt`
if [[ $STABLE_VERSION = "" ]] ; then
    echo 'Could not get stable-version of pythonbrew.'
    exit 1
fi
TEMP_FILE="pythonbrew-$STABLE_VERSION"
TEMP_TARBALL="$TEMP_FILE.tar.gz"
DOWNLOAD_URL="http://pypi.python.org/packages/source/p/pythonbrew/$TEMP_TARBALL"

こんな感じのコードだった。「stable-version.txt」には、「0.7.2」と書いてあったので、下記のようなファイルになる。

http://pypi.python.org/packages/source/p/pythonbrew/pythobrew-0.7.2.tar.gz

なるほど、きっとこのファイルが存在しないとか、ちゃんと解凍できないとかいうのが原因だ。と思って、普通にブラウザでDLしてみる。と普通に問題なく存在するし、ちゃんと解凍できる、えー。

もっかいpythobrew-installに戻る。

builtin cd $PATH_DISTS ; curl --progress-bar -kL $DOWNLOAD_URL -o "$TEMP_TARBALL"

この辺でtag.gzのファイルをDLしているので、直後にこいつがちゃんとgzファイルなのかfileコマンドで確かめてみる

file $TEMP_TARBALL #=> これが 「HTML document text」とかいってくる。

え。なんでHTML document text なん?とかもうこの辺からパニックに陥る。素で上記URLをwgetやらcurlやらで叩いたら、ちゃんと目的のファイルなのに意味不明すぐる。

でやっぱDLするところで、何かが起こってるんだろうと思って最初のコードに戻って、各変数をechoしてみる。

STABLE_VERSION=`curl -skL https://github.com/utahta/pythonbrew/raw/master/stable-version.txt`
if [[ $STABLE_VERSION = "" ]] ; then
    echo 'Could not get stable-version of pythonbrew.'
    exit 1
fi
echo $STABLE_VERSION
#=> 0.7.2

TEMP_FILE="pythonbrew-$STABLE_VERSION"
echo $TEMP_FILE
#=> pythonbrew-0.7.2

TEMP_TARBALL="$TEMP_FILE.tar.gz"
echo $TEMP_TARBALL
#=> .tar.gzrew-0.7.2

DOWNLOAD_URL="http://pypi.python.org/packages/source/p/pythonbrew/$TEMP_TARBALL"
echo $DOWNLOAD_URL 
#=> .tar.gzpypi.python.org/packages/source/p/pythonbrew/pythonbrew-0.7.2"

なにーこれーきもいんですけどww。とかよく分からない口調になっちゃうほど、TEMP_TARBALLとかいう変数を作ってるあたりから、精神が加速し始めてる世界になってる。

多分、達人プログラマーな人はこの時点で何が起きてるのか、わかっちゃうんだろうけど、そこは情弱な僕なので全く理解できずに、世界を恨み始める。

で何がいけないのか分からないけど、変数展開が何かしらおかしくなっている事は想像できる。でその原因となりそうなのは、やっぱり、curlしてるところ。なのでバージョン番号をベタなヤツに置き換える。

STABLE_VERSION='0.7.2'

はい。これで動かしてみたら、DOWNLOAD_URLはちゃんとしたURLなりました \(^o^)/ めでたしめでたし。

じゃなくて、なんでそうなる? まぁ再現できるコードを書いてみる。curlの部分では何が起こっているのかというとこんな感じ

STABLE_VERSION=`echo -e "0.7.2\r"`
echo $STABLE_VERSION
TEMP_FILE="pythonbrew-$STABLE_VERSION"
echo $TEMP_FILE
TEMP_TARBALL="$TEMP_FILE.tar.gz"
echo $TEMP_TARBALL
DOWNLOAD_URL="http://pypi.python.org/packages/source/p/pythonbrew/$TEMP_TARBALL"
echo $DOWNLOAD_URL

端的に言うと、stable-version.txtの中に、ラインフィード (リターンコード)「\r」入ってますよ。。。
でSTABLE_VERSIONの中に「\r」が入ってて、TEMP_TARBALL変数を作るときに変な事になる。

TEMP_TARBALL="$TEMP_FILE.tar.gz" 

# $TEMPFILE => "pythonbrew-0.7.2\r" 
# "pythonbrew-0.7.2\r" が変数展開されて、
# その後にかぶさるように「.tar.gz」が乗っかってる結果になる
# ".tar.gzrew-0.7.2"

何これ、なんて挙動?あまりに情弱すぎてよく動きが分からねぇ。まぁ原因は分かったので対処方法だけ書いておく。pythobrew-installの中で、curlで「stable-version.txt」をDLしてる所で改行コードを置換すればよいよ。

STABLE_VERSION=`curl -skL https://github.com/utahta/pythonbrew/raw/master/stable-version.txt | sed -e 's/[\n\r]//g'`

# | sed -e 's/[\n\r]//g'  の部分を追加して、改行コードを消したった。

これで無事にインストールができました。長々と駄文を書いてすいません。

Let's エンジョイ pythonbrew !