Virtualenv创建的环境拷贝到新的目录后也能用,只需要修改路径
举个例子
假设环境名为:env_nmf
该环境原始的目录是:/home/amily/workspace/env_nmf
将环境拷贝到这个目录:/data3/amily/sourcecode/env_nmf
核心:环境直接拷贝到新的目录能够生效的根源是编译器路径正确
对于virtualenv创建的环境,其bin目录下的每一个可执行文件,会指定程序被执行时所使用的编译器所在的路径,因此为了能够保证这些可执行文件能够正常的被调用执行,需要批量的修改文件中指定编译器的路径为正确的路径即可生效。
下面的代码是env_nmf/bin/pip这个可执行文件使用vim查看到的内容,第一行代码指定的编译器是旧目录的python3.6(你用vi来查看该目录下其他文件也会有类似下图这句#!),如果我们直接通过source激活这个环境来使用python是会报错的,主要原因就是环境中使用的路径还是旧的路径,需要修改成拷贝后的新的路径才能正常访问。
#!/home/amily/workspace/env_nmf/bin/python3.6
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
解决办法
使用批处理命令,快速替换指定操作目录env_nmf/bin下的所有文件中的旧路径为新路径
需要注意的是:原始字符串是路径,路径中出现/会与命令中的/重复,需要用**右斜杠“\”**进行转义
这里一定要写对!这里一定要写对!这里一定要写对!
// linux中的sed命令可以实现对指定路径env_nmf/bin下的所有文件进行字符串替换
// 语法:
sed -i "s/原始字符串/新的字符串/g" `grep 原始字符串 -rl 指定操作目录`
// 本例中的命令
sed -i "s/home\/amily\/workspace/data3\/amily\/sourcecode/g" `grep home\/amily\/workspace -rl env_nmf/bin`
上述命令运行完成后再使用source来激活环境,即可正常使用环境的python和pip~
测试是否正常使用的简单办法就是输出python和pip版本,如果这两个都不能正常,后面要跑程序很难跑成功。
python -V
pip -V