Linux环境下Virtualenv环境直接拷贝后python和pip用不了

  • Post author:
  • Post category:linux


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