0%

Python拷贝虚拟环境的方法

Python 虚拟环境拷贝并不是仅仅的复制目录,本文用于记录自己实践的拷贝 Python 虚拟环境的方法。

Python 虚拟环境非常好用,有时候需要我们拷贝一个已经配置好的虚拟环境,网上找了一下发现全是 pip freeze > requirements.txt,然后 pip install -r requirements.txt。这种操作很常见,但是对于一些不用pip安装的包,就没办法处理了,而且安装时间也是一个问题。

同一个机器之间拷贝

直接使用虚拟环境 virtualenv 自带的工具 virtualenv-clone 或者 virtualenvwrapper 包装的工具 cpvirtualenv,用法很简单:

cpvirtualenv src dest

或者

virtualenv-clone source target

不同机器之间的拷贝

这个才是重点,因为服务器的虚拟环境安装了一些自己编译的包,需要拷贝过来用( pip freeze 处理不了)。下面是步骤:

直接拷贝源的 .virtualenvs 目录到目标机器

这一步一般是从一个 home 目录到另一个 home 目录,假设源机器是 /src/.virtualenvs,目标机器是 /dest/.virtualenvs

这一步拷贝之后,如果你的两个 .virtualenvs 的路径是一样的,恭喜你,你已经完成了,如果不一样,下面就需要做一些操作。

查看一下虚拟环境中的可执行文件的路径

比如有一个名为 venv 的环境,查看其可执行文件中配置的路径:grep "/src/.virtualenvs" /path/to/venv/bin -R。结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/dest/.virtualenvs/py2/bin/jupyter-notebook:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/pip2.7:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/coverage2:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-serverextension:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-kernel:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/chardetect:#!/src/.virtualenvs/py2/bin/python
/dest/.virtualenvs/py2/bin/jupyter-qtconsole:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/cythonize:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-kernelspec:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/easy_install-2.7:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/cython:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/range-detector:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/ipython:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/tqdm:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/activate.csh:setenv VIRTUAL_ENV "/src/.virtualenvs/py2"
/dest/.virtualenvs/py2/bin/jupyter-bundlerextension:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/wheel:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jsonschema:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/iptest:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/pip2:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/pbr:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/f2py:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/python-config:#!/src/.virtualenvs/py2/bin/python
/dest/.virtualenvs/py2/bin/activate:VIRTUAL_ENV="/src/.virtualenvs/py2"
/dest/.virtualenvs/py2/bin/coverage-2.7:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/ipdb:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-nbconvert:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/easy_install:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/cygdb:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-console:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-trust:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-troubleshoot:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-migrate:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/ipython2:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/pip:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/iptest2:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-run:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/coverage:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/pygmentize:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/jupyter-nbextension:#!/src/.virtualenvs/py2/bin/python2
/dest/.virtualenvs/py2/bin/activate.fish:set -gx VIRTUAL_ENV "/src/.virtualenvs/py2"

可以看出问题了吧?就是我们直接拷贝过来的,这些路径是没有改变的,如果 /src//dest/ 一样则完全没问题,如果不一样,则我们需要把 /src/ 调整为 /dest/,可以配合 sed 工具。

1
sed -i s/dest/src/g `grep -rl "/src/.virtualenvs" /path/to/venv/bin`

再用前面的命令查看就名为问题了。至此就完成了,直接可以愉快的使用了,又快又好用。