2013年6月30日日曜日

dev-lang/python と /usr/lib/portage/pym

昨日の投稿で、gentwoo が上手く動かないのは python と eselect のせい、と書いた。 dev-lang/python は 2.7.3-r3 から 2.7.4 の間に何が変わったのか、ということを調べてみた。

昨日書いたように、portage.util の ImportError が第一の原因なので、それを見てみる。 python-2.7.3-r3 では sys.path に ${EPREFIX}/usr/lib/portage/pym が含まれているが、python-2.7.4 では含まれない。 では、python-2.7.3-r3 ではどこでこのパスを設定しているのか。 それは site.py の中である。 site.py にそれを書き加えているのはパッチ tar ボールの中の 03_all_add_portage_search_path.patch である。 python-2.7.4 ではこのパッチが消えている。 おお、これだ。

だがちょっと待て。 だとすると、普通に Gentoo Linux を使っている人も同じ症状になってしまわないか?

ということで、VirtualBox に Gentoo Linux 環境をお手軽に用意するために liveDVD イメージをダウンロードして、起動。 最新の liveDVD とはいえ昨年末のなので、python のバージョンは 2.7.3 である。 当然、emerge --sync して emerge -1 =python-2.7.5 で 2.7.5 に上げる。 python2.7 を立ち上げて、import sys; print sys.path。 うん、なぜか /usr/lib/portage/pym がちゃんと含まれている。

パッチは消えたのだから、site.py には設定されていない。 環境変数? python -E で環境変数を無視して立ち上げると確かに pym のパスは消える。

$ env | grep pym
PYTHONPATH="/usr/lib/portage/pym"

そう、環境変数 PYTHONPATH で設定しているんだ。 環境変数自体は /etc/env.d/05portage で定義されていた。

翻って Prefix 環境で調べてみると、確かに ${EPREFIX}/etc/env.d/05portage が存在した。 このファイルが有効に働くタイミングは、特に何もしなければログインするたびだ。 つまり、ログインし直していればちゃんと PYTHONPATH が反映されて gentwoo も普通に動作していたはず、と。 ログインしっぱなしだもんなあ。

2013年6月29日土曜日

gentwoo と python と eselect と

Gentoo の portage の機能として、make.conf で PORTAGE_ELOG_COMMAND にログ出力用の任意のコマンドを指定して実行させる仕組みがある。 gentwoo はそれを利用したログ収集のサイトで、そこにログを送るために betagarden overlay の app-portage/gentwoo をインストールして

PORTAGE_ELOG_SYSTEM="custom:* save"
PORTAGE_ELOG_COMMAND="gentwoo '${PACKAGE}' '${LOGFILE}'"

といった行を make.conf に書き加えてある。

最近、といってももう3週間ぐらい、この gentwoo の呼び出しでエラーが発生するのである。

二種類のパターンがある。 一つめは gentwoo-2.7 という(Python 2.7 で実行される)スクリプト本体で発生するエラー。

Traceback (most recent call last):
  File "/Users/tetsushi/Gentoo/usr/bin/gentwoo-2.7", line 11, in 
    from portage.util import getconfig
ImportError: No module named portage.util
!!! PORTAGE_ELOG_COMMAND failed with exitcode 1

二つめは gentwoo というラッパーシェルスクリプトで発生するエラー。

/Users/tetsushi/Gentoo/usr/bin/gentwoo: Execution of 'eselect python show --python2' failed
!!! PORTAGE_ELOG_COMMAND failed with exitcode 1

どちらのエラーも portage がインストールする ${EPREFIX}/usr/lib/portage/pym/portage/elog/mod_custom.py で spawn_bash の引数に env=os.environ を追加すれば回避できるようだが、このファイルは数年書き変えられていないので挙動が変わってしまった真の原因ではない。

portage と eselect のバージョンによるエラーのパターンは以下の表の通り。 portage のバージョンは現在 prefix ツリーにある最古と最新。 eselect のバージョンは最近エラーが変わる前後のバージョン。

portage-2.2.01.219382.2.01.22013
eselect-1.3.4パターン1パターン1
1.3.5パターン2パターン2

eselect は予想通りの結果だったけど、portage はエラーが起こり始めたと思った時点よりも前の 2.2.01.21938 でも再現されてしまって意外な感じ。 gentwoo のバージョンも関係ないし、原因が判らない。

と書いたところで思い出した。 そういえば最初にエラーが出た6月10日前後、python のアップデートもあった。 現在使っているのは dev-lang/python-2.7.5 だ。 ebuild の更新が6月のバージョンを避けて python-2.7.3-r2 を emerge すると、パターン1は再現しなくなった。 6月に更新されているけど 2.7.3-r3 も OK。 しかし 2.7.4 は再びエラーだ。

結論。パターン1は python 側の何らかの変更が原因。 パターン2は eselect の何らかの変更が原因。 さて、どこにどう報告すればいい?

2013年6月7日金曜日

人間ドック

初人間ドック。

バリウム飲んでぐるぐる回されると話には聞いていたが、なるほどぐるぐる回らされた。 バリウムが飲みにくいとか言われたが、ラッシーと変わらないぐらいじゃないの。

今日は身長が169センチ台の半ばだった。 いつもは168センチ台後半ぐらいなので、微妙に高めに出ている。

眼底検査の時に「睫毛が長くて邪魔」とか言われたが、ごめんなさい生えてる向きがわりと下向きなだけだと思います。

裸眼視力は相変わらず1.5あった。

腹囲を測るときに「ズボンのウエストサイズより太めに出るかもしれません」とか医者が言ったが、(私にとっては)逆です、先生。 いわゆる"メタボ"体型を念頭に置いて検査が出来上がっているんだな、と。

そんなこんなで検査が終わって、バリウムを排出するために下剤を飲んで下さい、という指示に素直に従った。 そして、飯を食って会社に向かう電車の中で腹痛が始まった。 何が印象に残ったって、もう何よりもこの腹痛による消耗した気分だった。