python包管理工具介绍
  杨昆 y@zhihu.com
进入python的世界



              Python如何管理它的软件?

              egg是python组件的基本单位,
              类似java中的jar包,ruby中
              的gem。

              easy_install/pip 即是python的
              apt-get。

              $easy_install xxx
              $pip install xxx
egg的结构

$ tree hello
hello
├── hello
│ └── __init__.py
├── hello.egg-info
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ ├── dependency_links.txt
│ ├── entry_points.txt
│ ├── not-zip-safe
│ └── top_level.txt
├── setup.cfg
└── setup.py
包的依赖关系

$ cat setup.py

from setuptools import setup, find_packages

setup(name='hello',
    version=version,
    ...
    keywords='',
    author='',
    install_requires=[
    'tornado',
    'mysql-python',
    'cherrypy',
    ],
   ...
    )
用namespace来组织你的包
setup.py
~~~~~~~~~~~
                                $ tree fly.skels
setup(
   ...                          fly.skels/
  namespace_packages=['fly'],   ├── README.rst
                                ├── fly
)                               │ ├── __init__.py
                                │ └── skels
                                │     └── __init__.py
                                ├── fly.skels.egg-info
                                ├── setup.cfg
                                └── setup.py
使用virtualenv和pip

(sandbox) $ pip install -r requirements.txt

(sandbox) $ cat requirements.txt
simplejson
redis==2.0.0
-e svn+http://svn.myproject.org/svn/MyProject/trunk#egg=MyProject
-e git://git.myproject.org/MyProject.git#egg=MyProject
tornado
sqlalchemy
virtualenvwrapper

● 创建虚拟环境
  $ mkvirtualenv testenv

● 在多个虚拟环境之间切换

   $ lsvirtualenv
   sandbox
   testenv

   $ workon sandbox
   (sandbox)$
virtualenv的问题

● 多版本软件管理混乱

● pip安装可能会失败, easy_install不够灵活

● 重复下载,安装,在多项目及有c包的时候耗时较长

● 还是需要手动构建环境
认识buildout

● 从一个配置文件,可以构建整个环境, wirte once, deploy often。
  类似于java中的maven

● python包版本控制

● 利用系统中已有的软件,无需重复下载安装

● 各种recipe用于支持开发、部署等
运行buildout

$ python bootstrap.py

$ ./bin/buildout
pin versions

[buildout]

versions = versions

[versions]
tornado = 2.3
sqlalchemy = 0.7.8
hiredis = 0.1.1
flask = 0.9
pin versions

[buildout]
extends = http://mirror.in.zhihu.com/buildout/0.1/version.cfg
versions = versions
multiple configuration

[buildout]
extends = etc/base.cfg
           etc/version.cfg
         etc/supervisor.cfg
Install thirdparty software

[zeromq]
recipe = zc.recipe.cmmi
url = http://download.zeromq.org/zeromq-2.1.6.tar.gz
install thirdparty software

[curl]
recipe = hexagonit.recipe.cmmi
url = http://curl.haxx.se/download/curl-7.21.3.tar.bz2
md5sum = 5b57fee22090b5c43a6886fdd35af2ce
configure-options =
 --disable-ldap
 --disable-ldaps
 --disable-rtsp
 --disable-proxy
 --disable-dict

environment =
 PATH=${pkgconfig:location}/bin:%(PATH)s
 PKG_CONFIG_PATH=${openssl:location}/lib/pkgconfig
 LDFLAGS=-Wl,-rpath -Wl,${zlib:location}/lib -Wl,-rpath -Wl,${openssl:
location}/lib
私有pypi

● localshop
● pypiserver
Skeleton tool

http://pypi.python.org/pypi/fly.skels

Python包管理工具介绍