最近自己参与的一个项目接近尾声,需要把代码部署到甲方提供的服务器。本来想着没有什么困难,谁知道甲方提供的服务器需要连接到vpn堡垒机之后才能连接,并且服务器是不能与外网直接连接的。知道真相的我眼泪掉下来。

平常的开发中,用惯了pip install xxxx或者是pip install -r requirements.txt,没怎么考虑过如何在与外网隔离并且是一个裸机的服务器上部署python项目(当然,如果项目依赖比较少,可以直接下载源码安装,如果依赖比较多就会比较麻烦)。
经过一番搜索发现了一款神器:pip2pi,它能够把当前项目的依赖项放置在一个目录中,然后把这些依赖放到服务器上再使用pip安装。

具体用法

在使用pip2pi打包项目依赖之前,需要找一个和服务器环境相同的虚拟机:比如说服务器操作系统是centos6.5、python版本是2.7,那就需要自己弄个虚拟机把环境搞一致再下载依赖项。
详细步骤如下:

  1. 为了避免多余依赖的引入,最好是用virtualenv创建一个隔离环境:virtualenv packages
  2. 获取当前项目的所有依赖,进入隔离环境,将项目的依赖项完整下载:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    cd /path/to/project
    pip freeze > requirements.txt
    cp requirements.txt /path/to/packages/

    cd /path/to/packages
    source bin/active
    pip install pip2pi
    mkdir dependences
    pip2pi /path/to/packages/dependences --no-use-wheel -r requirements.txt
  3. 将下载好的依赖项放在服务器,执行命令安装依赖,第一遍安装可能跳过某些依赖项,可以多次执行这个命令:

    1
    pip install --no-index --find-links=file:///path_to/packages/dependences -r requirements.txt