PyPI からパッケージの tarball を取ってくる

PyPI からパッケージの tarball を一括して取ってきたいと思ったのでちょっと試してみたことをメモ。

ソース

#-*- coding:utf-8 -*-

import os
import sys
import pprint
import pkg_resources as pkg
from setuptools import package_index as index


def get_source_tarball(pkgnames, targetdir='/tmp/packages'):

    if not os.path.exists(targetdir):
        os.makedirs(targetdir)

    idx = index.PackageIndex()
    ws = pkg.WorkingSet()

    env = pkg.Environment(targetdir)

    reqs = [pkg.Requirement.parse(x) for x in pkgnames]

    for req in reqs:
        dist = idx.fetch_distribution(req, targetdir, source=True)
        ws.add(dist)


    resolved = ws.resolve(reqs)
    pprint.pprint(resolved)


    for dep in resolved:
        req = dep.as_requirement()
        print req
        path = idx.fetch(req, targetdir, source=True)

        print path


get_source_tarball(['pylons'])

これを実行すると pylons とその依存モジュールの tarball が保存される。

結果

[Pylons 1.0 (/usr/local/lib/python2.6/dist-packages/Pylons-1.0-py2.6.egg),
 Tempita 0.5dev (/usr/local/lib/python2.6/dist-packages/Tempita-0.5dev-py2.6.egg),
 WebTest 1.2.1 (/usr/local/lib/python2.6/dist-packages/WebTest-1.2.1-py2.6.egg),
 WebError 0.10.2 (/usr/local/lib/python2.6/dist-packages/WebError-0.10.2-py2.6.egg),
 WebOb 0.9.8 (/usr/local/lib/python2.6/dist-packages/WebOb-0.9.8-py2.6.egg),
 Mako 0.2.5 (/usr/lib/pymodules/python2.6),
 nose 0.11.3 (/usr/local/lib/python2.6/dist-packages/nose-0.11.3-py2.6.egg),
 decorator 3.2.0 (/usr/local/lib/python2.6/dist-packages/decorator-3.2.0-py2.6.egg),
 simplejson 2.0.9 (/usr/lib/pymodules/python2.6),
 FormEncode 1.2.2 (/usr/local/lib/python2.6/dist-packages/FormEncode-1.2.2-py2.6.egg),
 PasteScript 1.7.3 (/usr/local/lib/python2.6/dist-packages/PasteScript-1.7.3-py2.6.egg),
 PasteDeploy 1.3.3 (/usr/local/lib/python2.6/dist-packages/PasteDeploy-1.3.3-py2.6.egg),
 Paste 1.7.3.1 (/usr/local/lib/python2.6/dist-packages/Paste-1.7.3.1-py2.6.egg),
 Beaker 1.5.4 (/usr/local/lib/python2.6/dist-packages/Beaker-1.5.4-py2.6.egg),
 WebHelpers 1.0rc1 (/usr/local/lib/python2.6/dist-packages/WebHelpers-1.0rc1-py2.6.egg),
 Routes 1.12.3 (/usr/local/lib/python2.6/dist-packages/Routes-1.12.3-py2.6.egg),
 WebOb 0.9.8 (/usr/local/lib/python2.6/dist-packages/WebOb-0.9.8-py2.6.egg),
 Paste 1.7.3.1 (/usr/local/lib/python2.6/dist-packages/Paste-1.7.3.1-py2.6.egg),
 simplejson 2.0.9 (/usr/lib/pymodules/python2.6),
 Pygments 1.3.1 (/usr/local/lib/python2.6/dist-packages/Pygments-1.3.1-py2.6.egg),
 Tempita 0.5dev (/usr/local/lib/python2.6/dist-packages/Tempita-0.5dev-py2.6.egg),
 PasteDeploy 1.3.3 (/usr/local/lib/python2.6/dist-packages/PasteDeploy-1.3.3-py2.6.egg),
 Paste 1.7.3.1 (/usr/local/lib/python2.6/dist-packages/Paste-1.7.3.1-py2.6.egg)]
Pylons==1.0
/tmp/packages/Pylons-1.0.tar.gz
Tempita==0.5dev
/tmp/packages/Tempita-0.5dev.tar.gz
WebTest==1.2.1
/tmp/packages/WebTest-1.2.1.tar.gz
WebError==0.10.2
/tmp/packages/WebError-0.10.2.tar.gz
WebOb==0.9.8
/tmp/packages/WebOb-0.9.8.tar.gz
Mako==0.2.5
Skipping development or system egg: Mako 0.2.5
/tmp/packages/Mako-0.2.5.tar.gz
nose==0.11.3
/tmp/packages/nose-0.11.3.tar.gz
decorator==3.2.0
/tmp/packages/decorator-3.2.0.tar.gz
simplejson==2.0.9
Skipping development or system egg: simplejson 2.0.9
/tmp/packages/simplejson-2.0.9.tar.gz
FormEncode==1.2.2
/tmp/packages/FormEncode-1.2.2.tar.gz
PasteScript==1.7.3
/tmp/packages/PasteScript-1.7.3.tar.gz
PasteDeploy==1.3.3
/tmp/packages/PasteDeploy-1.3.3.tar.gz
Paste==1.7.3.1
/tmp/packages/Paste-1.7.3.1.tar.gz
Beaker==1.5.4
/tmp/packages/Beaker-1.5.4.tar.gz
WebHelpers==1.0rc1
/tmp/packages/WebHelpers-1.0rc1.tar.gz
Routes==1.12.3
/tmp/packages/Routes-1.12.3.tar.gz
WebOb==0.9.8
/tmp/packages/WebOb-0.9.8.tar.gz
Paste==1.7.3.1
/tmp/packages/Paste-1.7.3.1.tar.gz
simplejson==2.0.9
/tmp/packages/simplejson-2.0.9.tar.gz
Pygments==1.3.1
/tmp/packages/Pygments-1.3.1.tar.gz
Tempita==0.5dev
/tmp/packages/Tempita-0.5dev.tar.gz
PasteDeploy==1.3.3
/tmp/packages/PasteDeploy-1.3.3.tar.gz
Paste==1.7.3.1
/tmp/packages/Paste-1.7.3.1.tar.gz