每天进步一点点:迁移virtualenv环境

因为工作需要,打算将一台服务器上运行的一组程序迁移到另外一台服务器上。程序运行在virtualenv环境下,正常的方式是在目标服务器上安装设置virtualenv环境、安装依赖库、迁移程序,比较麻烦。

image.png
(图源 :pixabay)

于是我就想,既然virtualenv环境下的东西都已经包含在对应目录内,那么我直接把整个目录的内容复制到目标服务器上是否可行了,如果可以,就省事多啦。

想来想去,不如一试,撸起袖子直接干吧。

首先在目标服务器上建好用户:abcd1111,然后使用scp指令将原来服务器对应用户目录内的所有数据复制过来。

然后使用source ~/venv/bin/activate激活环境,发现能正常进入到virtualenv环境。

执行一下python指令,却提示我:

Command 'python' not found, but can be installed with:

虽然python3可以用,但是执行我的程序却提示找不到依赖库:

ModuleNotFoundError: No module named 'xxxxx'

这肯定不对,和在原来环境下执行的效果不一样,我首先想到的就是环境变量的问题,看一下环境变量:

echo $PATH

显示如下:

/home/abcd1234/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

这很明显不对,因为abcd1234是原来服务器上的目录,新服务器上目录名为abcd1111

环境变量是哪里引进的呢,我看一下~/venv/bin/activate内容,其中包含如下片段:

VIRTUAL_ENV="/home/abcd1234/venv"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

我觉得把上述代码中abcd1234修改为abcd1111就应该能用了,不过安全起见,我看看bin目录中是否有别的文件应用到abcd1234这个目录名:

grep -r "abcd1234" ./

嚯,一查还一大堆:

Reveal spoiler

image.png

那么只改~/venv/bin/activate可能就会有一些意想不到的问题,安全的做法是将~/venv/bin/目录中所有文件中的abcd1234修改为abcd1111

这时候,又是需要sed闪亮登场了,执行如下命令:

sed -i "s/abcd1234/abcd1111/g" `grep -rl "abcd1234" ./`

然后再去查看一下文件内容,grep -r "abcd1111" ./,可以看到都已经换成abcd1111啦:

Reveal spoiler

image.png

重新登录,激活环境,然后发现无论是直接敲python进入到python环境还是直接执行我的各种脚本都没有任何问题,如丝般顺滑......