diary/Kojima

・python の練習

xorg の新しいのを試してみたいけど,git を使うのも面倒なので, ftp://xorg.freedesktop.org/pub/xorg/individual/ から,一番バージョンが大きいパッケージを ダウンロードするスクリプトを書いてみた.

#!/usr/bin/python
# -*- coding: euc-jp -*-;

import urllib, os
baseurl = 'ftp://xorg.freedesktop.org/pub/xorg/individual/'
dirs = [ 'app', 'data', 'doc', 'driver', 'font', 'lib', 'proto', 'util', 'xserver']

def check_version(a, b):
    d1 = [ ]
    d2 = [ ]
    for i in a.split('.'):
        d1.append(int(i))

    for i in b.split('.'):
        d2.append(int(i))

    if d1 > d2 :
        return a
    else:
        return b

opener = urllib.FancyURLopener({})
namelist = { }
namekeys = [ ]
for i in dirs:
    url = baseurl + i
    f = opener.open(url)
    data = f.read()
    f.close()

    for line in data.splitlines():
        dt = line.split()
        if dt[8].find('bz2') > 0:
            index = dt[8].find('.tar.bz2')
            tmpname = dt[8][0:index]
            index2 = tmpname.rfind('-')
            key = i + ":" + tmpname[0:index2]
            if key not in namekeys:
                namekeys.append(key)
                namelist[key] = tmpname[index2+1:]
            else:
                chk = namelist[key]
                new = check_version(chk, tmpname[index2+1:])
                namelist[key] = new

for i in namelist:
    (dir, file) = i.split(':')
    url = baseurl + dir + '/' + file + '-' + namelist[i] + '.tar.bz2'

    filename = 'xorg/' + dir + '/' + file + '-' + namelist[i] + '.tar.bz2'
    if os.access('xorg/' + dir, os.F_OK) == False:
        os.mkdir(dir)
    if os.access(filename, os.F_OK) == True:
        print filename, "is already exist."
        continue
    else:
        print "getting", dir, url
        f = opener.open(url)
        data = f.read()
        f.close()
        output = open(filename, 'w')
        output.write(data)
        output.close()

このディレクトリには,それぞれの分野ごとのサブディレクトリに公開されたパッケージの全ての(?) バージョンがtar.bz2 と tar.gz の形式で保存されているのだけど,wget とかで全部取り寄せるのも非効率だし, 手動でバージョン番号の最新のものだけを取るのも面倒だし,ということで,python で書いてみた.

とりあえずサブディレクトリのリストは事前に持っていて,それぞれに対してリスティングを取って, tar.bz2 なファイル名のみを取り出して,'ファイル名:最新バージョン番号' のディクショナリに収めてから, そのディクショナリを元にファイルをダウンロードして保存するような感じ.

それほど大した処理をしているわけではないけど, バージョン番号は単純にファイル名から切り出して文字列として比較(辞書的順序)するだけでは 1.9.10 > 1.10.1 になってしまうので,check_version() でバージョン番号の各部を取り出して数値のリストにして比較しているつもり.

まだまだ Python のコードは Python tutorial やライブラリリファレンスを見ながらじゃないと書けないレベルだけど, python のコードって,書き順がきちんと決まった楷書で書いているような感じ. それに比べると perl のコードは作者のひらめきがそのまま反映した草書みたいな印象.

# ruby は調べてないけど,楷書と草書の中間の行書みたいだったら面白いな

このヘンは ad hoc な作業を簡単にこなすために開発された perl と, それを反面教師とした python の由来に起因する違いのような気がするところ.

# まぁ,python はお手本を見ないと書けないレベルだからそう感じるだけなのかも知れないが(苦笑



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41