python多版本共存、venv的使用和更改
看这篇文章之前你须要了解的
在Windows下推荐Anaconda,Linux和Mac下推荐Miniconda,倘若不是由于不明缘由它们工作不良的话请用这两个工具套装来管理python!不要直接裸装python环境!
conda虽然其自身的缺陷,但绝对比白板装python要便捷得多,你甚至可以只把它单纯只当成是python版本管理器而不管其他功能。
本文只是介绍假如你不得不用python的话可以用哪些方法管理多个虚拟环境,事实上你会发觉这很麻烦。
环境
本文讨论linux环境下源码安装python的情况,假如你是在windows会略有区别但区别不大,相信本文看完后一样会有所收获。本文默认你早已了解了linux系统的一些基本操作如步入文件夹、删除等,以及python的基本使用。不懂的可以自行百度。
主要区别有:
没弄懂我在说哪些的没关系,往下我就会重新提及在windows环境的操作
为何要安装多个python版本
好多库(我说的就是tensorflow)常常有新版本不兼容旧版本代码的现象,因而虽然python的句型能做到前后版本兼容(我是说python3,先不提2),我们也常常须要同时安装很多个tensorflow的版本。
问题就这了:tensorflow的老版本不乐意支持最新版本的python,例如这个tensorflow的1.10.1版本
最新就支持到python3.6,注意这个更新时间在2018年,也就是说在18年以后我们新买的机器装上python3.7了,甚至3.8了(有时侯你会喜欢新特点不是吗),这玩意儿早已不支持了,才过2年的代码就跑不了了(本文写于2020年)!这时侯你须要python3.6。
源码安装python
python官网下载各个版本的python源码,瞧准要下的源码右键复制地址就行,之后随你喜欢用wget,curl或则其他东西下载,随便,比如:
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
下载然后解压,我这儿下载的是tgz的源码,所以
tar -zxvf Python-3.8.2.tgz
进到解压下来的文件夹里,之后三连
./configure
make
sudo make install
假如要自定义安装目录,可以加--prefix编译选项
./configure --prefix /usr/local/lib/python38
其他版本的按类似方式搞就可以啦,重命名成相应的版本号。我这儿直接用38,少打个点省事。
在环境里添加软联接,或则说linux版的快捷方法,便于直接调用:
sudo ln -s /usr/local/lib/python38/bin/python3 /usr/local/bin/python3
sudo ln -s /usr/local/lib/python38/bin/python3 /usr/local/bin/python38
类似地设置好其他版本的软联接,我建议把最新版本的python设置成python3linux系统官网,各个版本再设置python3n的软联接,默认的python是python2.7
windows安装多版本python
在python官网找到要下的版本,拉到最下边下载Windowsx86-64executableinstaller就好啦
安装记得自定义安装目录,添加环境变量,安装结束以后把各个安装目录里的python.exe改好名
pip的使用
因为多个python版本共存的缘由,假如你懒得单独给每位pip设置软联接,那之后就不要图省事了:
python38 -m pip install --upgrade pip
linux环境默认安装的python没有pip的问题(20200418降低)
sudo easy_install pip
使用这个命令应当可以解决这个问题(起码我这儿解决了)。
venv的使用
类似piplinux学习视频,如下代码:
python38 -m venv test
将在当前目录下创建一个虚拟的python环境的文件夹,版本是python3.8,环境名为test,文件夹里是python3.8的类库和标准库。
我推荐的使用方法是在你的项目里专门为这个项目创建虚拟环境,环境直接保存在项目文件夹里,省事。
启动这个虚拟环境的方式:
source ./test/bin/activate
在这儿只有一个python的版本,就是你所选择的哪个版本,所有用到的第三方库都须要重新安装,也因而何必害怕原先环境的兼容问题linux下查看python版本信息,玩坏了直接删除这个文件夹重来就行,十分便捷。
关掉虚拟环境有两个方式:要么直接关闭这个termianl,要么用这个命令:
deactivate
就可以了。你甚至可以输入一半用tab补全。
windows下venv的创建和使用
创建和linux环境下毫无区别,也可以用一样的形式使用,只是不须要用source命令调用了,直接运行activate就可以。注意路径里的/要改成。
windows多了一种使用方法:调用activate.bat和deactivate.bat,它们和activate都在虚拟环境文件夹的在Scripts文件夹里
对activate和deactivate的更改
有时我们安装的第三方包(又是你,tensorflow)会须要gpu(tensorflow-gpu)或则其他非python的支持,比如:
可以听到不同版本的tensorflow须要不同版本的cuda和cudnn支持,我们希望在activate的时侯顺便把cuda和cudnn的版本一起改了,deactivate的时侯再改回去。有时我们会碰到更复杂的需求,想要在activate和deactivate的时侯同时运行一些东西。以下以更改cuda和cudnn版本为例。
cuda和cudnn版本的更改
修改cuda和cudnn版本须要做的就是删掉cuda的默认软联接再重新创建一个指向正确版本的软联接,cudnn和cuda是配套绑定在一起的,其本身就在cuda的文件夹里。诸如修改为10.0版本的cuda:
sudo rm /usr/local/cuda
sudo /usr/local/cuda-10.0 /usr/local/cuda
更改回10.1版本用一样的手法就可以
sudo rm /usr/local/cuda
sudo /usr/local/cuda-10.1 /usr/local/cuda
source命令剖析和venv脚本更改思路
source和sh似乎是一样的命令,都是执行shell脚本。区别在于sh命令是新建一个子shell并复制父shell的状态linux下查看python版本信息,此后的命令都在子shell中运行,因而对父shell没哪些影响,而source则是直接在当前脚本运行。这就是两者惟一的区别(先如此理解就好,由于我不晓得有没有别的区别)。
常常执行命令须要root权限,假如我们把须要root权限的命令写入了脚本,如更改cuda和cudnn的命令(/usr/local的改动须要root权限),则须要sudo或则切换到root用户。于是在执行下边这个命令的时侯
sudo source test/bin/activate
出现了如下报错
这是因为source是bash外置的命令,不是shell命令。切换到root用户以后不须要用sudo因而可以解决问题,而且我不想那么做。
虽然解决方法十分简单,就是直接在脚本里须要root权限的命令前加sudo,运行时就不须要sudo了,尽管依然须要输入一次密码。
有了如上知识,venv的activate脚本的更改思路也就很清晰了:直接在最后面加上须要运行的命令就好。
deactivate的更改
我们来看代码
观察到:deactivate似乎是activate里定义的函数,因而直接把命令插入到33行下边,函数内部就好。这么,虚拟环境激活和停止的额外命令添加问题基本解决。
windows下的区别
windows下运行activate实际上是调用的activate.bat,deactivate也是调用了deactivate.bat,因而直接在activate.bat和deactivate.bat更改就好了。
下边的都是activate调用两个bat文件的证明了,不想看的跳过就好。