这里以CentOS系统为例。CentOS默认会安装Python2。而且这个python2不能随便删除,因为它被很多程序所依赖。所以不要轻易删除,不然会出现问题。
那么我们可以自行下载Python3的源码,编译,安装到独立的目录下。
Python3和Python2是相互独立的,不会影响对方。
通常来说python3程序的prefix目录放在/usr/local中。
1、下载python3源码:
python源码的网址是:https://www.python.org/ftp/python/
可以打开浏览器查看合适的版本,然后再linux系统中用wget命令+网址下载下来;如下图所示:
2、编译python3源码:
下载完源码,将压缩包解压,可以使用命令行 tar -zvf Python-3.8.3.tgz
2.1 编译前先安装python所需的依赖包:
有个很方便的方式,输入如下指令,会自动安装python所需的所有依赖包。
或者可以逐一安装依赖包:
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel zlib-devel ncurses-devel tk-devel libffi-devel gcc make
2.2 在/usr/local下创建python3文件夹:mkdir /usr/local/python3
2.3 cd到解压的python源码文件夹中:cd Python-3.8.3
2.4 指明安装路径:./configure --prefix=/usr/local/python3
2.5 开始真正的编译:make && make install
接下来就是等待编译完成,如果编译过程中有报错,根据错误提示安装相应的依赖包或者根据情况解决错误;
3、为python3解释器添加软链接
进入/usr/local/可以发现多了一个python3文件夹,进入该文件夹如下图所示,这就是编译好的python3程序了。bin目录里面有个python3
然后输入./python3 我们就可以打开该解释器了,可以看到是python3.8.3版本;
不过这样子有点麻烦,因为每次都要进入到该文件夹下,输入./python3才行;
在我当前的环境下,任意地方输入python,显示的是python2
cd 到/usr/bin目录下,ls -l之后可以发现 python这个软连接指向了python2, python2这个软链接指向了python2.7;
我们在/usr/bin中创建一个python3软链接,链接到/usr/local/python3/bin/python3.8的解释器上;
这时候我们在任意地方输入python3都会顺利打开python3了,这里我就不占用python了,让python指向python2。
因为centos很多程序都依赖python2,为了防止出现问题,我就不修改python的软链接了。
4、其他:
其实现在实际开发很少会用到全局的解释器,而是会根据各个项目创建一个自己单独使用的python 环境,我们管这叫python虚拟环境。
virtualenvwrapper是管理Python虚拟环境的工具,可以很方便的为不同的项目建立独立的环境,每个项目都可以安装自己的依赖,同时也支持在不同的虚拟环境中存在不同版本的Python。
这样就解决了很多项目时,如果共用全局的python解释器而造成的依赖包相互冲突。或者时版本的问题。
引述网上的一段文字: https://www.cnblogs.com/fengqiang626/p/11788200.html
工程一多,难免会碰到不同的工程依赖不同版本的库的问题;
亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难。
此时,我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。
还有一段文字:https://www.jianshu.com/p/7ed2dfa86e90
为什么需要 virtualenvwrapper?而不是virtualenv?这要从 virtualenv 说起。virtualenv 的一个最大的缺点就是,每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,这就需要我们记住每个虚拟环境所在的目录。
一种可行的解决方案是,将所有的虚拟环境目录全都集中起来,比如放到 ~/virtualenvs/,并对不同的虚拟环境使用不同的目录来管理。virtualenvwrapper 正是这样做的。并且,它还省去了每次开启虚拟环境时候的 source 操作,使得虚拟环境更加好用。
所以我们可以知道这个wrapper是一个virtualenv的管理工具,用于将虚拟项目统一管理的工具;
接下来讨论一下如何安装,配置和使用virtualenvwrapper:
4.1 安装和使用virtualenv:
wrapper只是一个工具包装并简化对virtualenv的操作,因为virtualenv的操作太麻烦了。所以要使用wrapper必须先安装virtualenv。
这里先安装和使用virtualenv,然后感受它麻烦在哪?
安装输入 pip3 install virtualenv //如果安装失败参考下方virtualenvwrapper一样的处理,更换源 或者 下载缺失的依赖包后重新编译安装python
给virtualenv在/usr/bin下创建一个软链接
输入 virtualenv --system-site-packages myenv会在当前文件下创建一个虚拟环境myenv。进去之后查看发现继承了系统的第三方包。如果不加--system-site-packages就不会继承第三方包。
这里默认的是python3,因为virtualenv是通过python3中pip3安装的。如果要创建python2的话可以输入 virtualenv -p=/usr/bin/python2 myenv2就行了
我们发现上面的命令只是在当前路径下创建了虚拟环境文件夹。也就是说虚拟环境文件夹可以放在任何一个地方。
然后我们要cd到虚拟环境文件夹下,然后输入 source bin/activate ,才能真正进入虚拟环境,进入虚拟环境这个方法就比较复杂。
要退出当前虚拟环境的话,输入:deactivate。
所以virtualenv谈不上在虚拟环境之间来回切换,需要不断地进入环境,退出环境。虚拟环境文件夹的摆放位置也相对松散。
//这里要注意一下,一旦进入虚拟环境后,输入的python和pip都是指向当前的虚拟环境了,跟系统里面的那个没啥关系了。
4.2 安装virtualenvwrapper:
输入命令pip3 install virtualenvwrapper。
当然使用pip3安装virtualenvwrapper前可以给pip3配置一下环境变量,我的做法是在/usr/bin中创建一个指向pip3的软链接,这样输入pip3会可以找到pip3了。
然后是给pip3配置国内源,这样下载会快一些。
https://blog.csdn.net/wushiqi11/article/details/104673953/ //这篇文章介绍了配置pip源的两种方法,一种是临时的,一种是永久的;
此外在用pip3安装virtualenvwrapper时有时候会报错,我就遇到了下面这种情况的错误,原因时我编译python源码的时候,少安装了一个依赖包导致的。重新安装依赖包然后重新编译python就可以了
https://www.jianshu.com/p/69681655309b // pip3安装wrapper时"ModuleNotFoundError: No module named '_ctypes'"错误解决方法
4.3 配置virtualenvwrapper:
在~/.bashrc中写入如下配置,这几行的主要作用分别是设置统一管理目录,设置解释器所在路径,执行virtualenvwrapper.sh脚本(这个脚本在安装完wrapper后就会有的)。
如果要创建一个不带已经安装到系统的中第三方包的环境,可以加上参数 --no-site-packages,这样就可以得到一个不带任何第三方包的干净的python运行环境;
还有一个配置就是设置virtualenv的环境变量;
当然这个virtualenvwrapper只对本用户有效,不是全局的。我们可以稍后验证一下。
写入成功后,输入source ~/.bahrc,让脚本立即生效。
不过这里我后续发现一个问题就是我安装的virtualenv版本太新了,它已经不识别--no-site-packages这个参数。而且新版的virtualenv是默认不继承当前系统的第三方包了,所以你原本就是不希望继承第三方包的话,理论上不需要在配置文件.bashrc中加ARGS参数了。这是新旧版本的一个差异要注意,也就是默认情况发生了变化。新版本下,如果你希望创建一个纯净的虚拟环境就不需要在.bashrc中配置ARGS参数了。
但是如果你希望创建虚拟环境时继承系统的第三方包,可以在.bashrc中给ARGS参数赋值--system-site-packages ,这个是新版本virtualenv识别的参数,表示创建虚拟环境时继承系统的第三方包。
输入virtualenvwrapper再看一下,命令起作用了。
我切换到root用户,再输入一次virtualenvwrapper,可以发现,没有找到命令。
4.4 使用virtualenvwrapper:
我环境是这样的,在/usr/bin下,python指向的是python2,python3指向的是python3;使用python2可以输入python2或者python,使用python3可以输入python3;
4.4.1 创建,切换,退出 virtualenvwrapper环境
mkvirtualenv env
mkvirtualenv -p /usr/bin/python2 env2 # -p参数指定Python解释器程序路径或者--python=/usr/bin/python2.7
workon 虚拟环境名 //切换到指定虚拟环境
deactivate //退出虚拟环境
输入mkvirtualenv env之后,我们会发现在~/Envs/这个根目录下多了一个env文件夹。
而且发现提示符多了个env呢,进去之后发现创建的是python3的虚拟环境。
输入 deactivate 可以退出该虚拟环境:
如果我们要创建python2的话,可以手动指定解释器路径:mkvirtualenv -p /usr/bin/python2 env2
同样地,我们发现创建了一个基于python2的虚拟环境,提示符多了一个(env2)。
另外virtualenvwrapper的一个强大之处在于支持虚拟环境之间的切换:
输入workon 虚拟环境名,就可以切到指定的虚拟环境了,非常方便。
最后我们还可以删除指定的虚拟环境
输入rmvirtualenv env2 ,就很方便地删除了虚拟环境
我们发现virtualenvwrapper的一个特点就是统一将虚拟环境管理在一个根目录下,这个根目录有环境变量WORKON_HOME决定。这样虚拟环境就不会像virtualenv那样到处乱放了。
4.4.2 其他virtualenvwrapper命令
lsvirtualenv //罗列所有的虚拟环境
cdvirtualenv //进入当前虚拟环境的主目录中
lssitepackages // 罗列sitepackages中的内容
cdsitepackages //进入到sitepackages目录中
5、环境的一致性
假如我们本地开发好了python,本地项目有完整的代码+依赖环境。
需要将本地项目发布到服务器上,那么一个问题就是必须保持服务器上的环境跟本地一致才行。
我们可以使用pip3 freeze > requirements.txt
产生一个requirements.txt的文本,这个文本描述了本地环境中的项目依赖包的所有信息。
然后在服务器中创建虚拟环境,在服务器的虚拟环境中输入pip3 install -r requrements.txt,从而导入和本地环境一致的项目依赖包。
注:这里补充一下pip和pip3区别:
1、pip是python的包管理工具,pip和pip3版本不同,都位于Scripts目录下:
2、如果系统中只安装了Python2,那么就只能使用pip。
3、如果系统中只安装了Python3,那么既可以使用pip也可以使用pip3,二者是等价的。
4、如果系统中同时安装了Python2和Python3,则pip默认给Python2用,pip3指定给Python3用。
参考链接:
https://www.cnblogs.com/cosiray/p/9946401.html //这里面依赖包的安装很简洁,值得借鉴
https://www.cnblogs.com/Liuyt-61/p/11621773.html //下载,编译,安装python
https://blog.csdn.net/jiduochou963/article/details/86694775 //pyhon源码包编译安装,挺详细的
https://www.jianshu.com/p/16d84e39c546 //安装virtualenvwrapper
https://pdf.us/2019/09/25/3660.html //virtualenv安装和使用
https://www.cnblogs.com/fengqiang626/p/11788200.html //virtualenv和virtualenvwrapper详解
https://www.cnblogs.com/zl1991/p/9041554.html //linux下切换python2和python3(转)