问题的起源在于,我在用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
这就意味着,我要把每个文件的这一句都改过来……(完)