python package and deploy

前言

python 打包和部署对于开源项目来说,pip/pypi 就足够了。但是对于公司线上的程序部署,有各种包依赖关系,需要做到依赖包隔离,程序版本管理,部署方式一致化。使用 docker 是很流行,并且通用的方式。还有没有更轻量的方式呢?这就是本文将介绍的内容。

一般来说,一个公司的线上系统版本是一致的,随系统发行版本带的 python 版本也是一致的。如果要跑不同的 python 版本,docker 是一个选择。这里讨论版本一致的情况。

介绍

用到了以下工具,

  • virtualenv,包隔离
  • fpm,打包工具,支持打包成 rpm/deb/osxpkg 等。

用 virtualenv 来做依赖包隔离,包含了自己的程序和依赖的包;系统自带的包管理工具(centos 是 rpm)来做版本管理,实现包的更新,回退。

操作步骤

fpm 安装(centos6 下为例)

  • 安装 virtualenv-tools。
    pip install virtualenv-tools
  • 安装 ruby(>=1.9.3),用到了 scl
    yum install rh-ruby23-ruby rh-ruby23-ruby-devel
    scl enable rh-ruby23 bash
  • 安装 fpm。
    gem install fpm

python项目

可以参考 pychinadns,需要写 setup.py。

打包

fpm --verbose -f -v 0.1.0 -n flowcleaner -s virtualenv -t rpm --virtualenv-pypi http://mirrors.aliyun.com/pypi/simple flowcleaner/
-s 指定源类型,-t 指定目标类型,-n 指定包名,flowcleaner/ 是项目目录。
会把整个 virtualenv 的目录打包到rpm里,virtualenv 里包含了依赖的包。

部署和运行

部署就是一个rpm包!跟标准的rpm包操作一样。

rpm 安装时,virtualenv 默认安装在 /usr/share/python 目录下。
执行/usr/share/python/flowcleaner/bin/python xxx.py来从 virtualenv 里运行。