virtualenv机制简述及强制改名产生的后遗症解决

问题的起源在于,我在用virtualenvwrapper创建虚拟环境的时候,不小心起错了名字,把“virtual”打成了“virtal”;于是每次workon的时候出来的都是virtalenv-py3,很难受。
后来我在Home文件夹中发现了隐藏的.virtualenv文件夹,打开就看到了virtalenv-py3文件夹,即你创建的虚拟环境以一个文件夹的形式保存在了.virtualenv里。
然后我直接改了虚拟环境文件夹的名字,把virtalenv-py3改成了virtualenv-py3,这时workon就变成了virtualenv-py3,修改成功。

然而后来问题出现了,我想使用tensorboard的时候,发现找不到这个命令;然后在虚拟环境里用pip list查看安装的package,发现和外围真实环境是一样的;也就是说,此时的pip等命令并不在虚拟环境里,而是真正的、virtualenv之外的环境。

这里简介一下.virtualenv/virtualenv-py3的几个目录结构:
bin是二进制文件,也就是,在虚拟环境中,通过命令行输入命令的时候,是在这个文件夹查找对应命令的。
.virtualenvs/virtualenv-py3/lib/python3.5/site-packages:这里就是安装的所有第三方包,和pip list是对应的。

查阅资料( 廖雪峰的官方网站)后发现virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source virtualenv-py3/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。

于是我打开了.virtualenv/virtualenv-py3/bin/activate文件,在43行看到:

VIRTUAL_ENV="/home/elijha/.virtualenvs/virtalenv-py3"

然后我把virtalenv改成了virtualenv。再从命令好输入命令,用tab补全,发现成功了,即此时环境变量已经指向了.virtualenv/virtualenv-py3/bin/而不再是真实的环境。

同时我发现还有一个activate.fish文件,里面39行同样有一个”/home/elijha/.virtualenvs/virtalenv-py3”,我也改成了正确的。

然后我又运行pip list,发现又报错:

bash: /home/elijha/.virtualenvs/virtualenv-py3/bin/pip: /home/elijha/.virtualenvs/virtalenv-py3/bin/python3: bad interpreter: Not a directory

我猜是pip脚本除了问题。又打开.virtualenv/virtualenv-py3/bin/pip文件,发现第一行为:
#!/home/elijha/.virtualenvs/virtalenv-py3/bin/python3

“#!”的意思是,让当前脚本被/home/elijha/.virtualenvs/virtalenv-py3/bin/python3解释器运行。我看了目录,的确有个python3程序。所以问题就明白了,pip没有找到对应位置的python3解释器;这是显然的,因为我改了目录。所以我把这一行的python3的路径改成了“virtualenv-py3”,随即成功。

但是我发现,这个bin文件夹里的所有py脚本的第一行都是:
#!/home/elijha/.virtualenvs/virtalenv-py3/bin/python3
这就意味着,我要把每个文件的这一句都改过来……(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值