在使用Python开发项目的过程中,因每个项目依赖包数量不一,各版本依赖情况不同,为保证项目间互不干扰且运行良好,通行的做法是为每个项目创建独立的Python执行环境,一般称之为Python虚拟环境。使用Python2的时候,喜欢使用virtualenv工具创建虚拟环境。近期,Python3风头正劲,项目升级为Python3优势明显,因此,考虑将开发项目逐步基于Python3重写。开始之初,首先要解决的就是Python3虚拟环境的创建。
以下方法经实际验证,可以适用于开发环境和生产环境下指定版本的Python3虚拟环境创建。以Ubuntu16.04生产系统下创建最新Python3.7.0版本虚拟环境为例,具体方法如下:
-
环境准备
在Ubuntu16.04下系统默认安装了Python2.7.6和Python3.4.3,而当前的项目要求的Python版本为3.7.0,为不影响和不改变系统Python运行环境,需要下载Python3.7.0最新版本按需编译,并基于该版本创建3.7.0的虚拟环境。mkdir /opt/soft wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz tar zxvf Python-3.7.0.tgz cd Python-3.7.0
-
编译并安装Python3
编译前指定Python3安装路径(重要)。指定python的安装路径,避免和系统已有的版本冲突,创建虚拟环境后Python3可以删除。./configure --prefix=/opt/python370 make make install
-
创建虚拟环境
在Python3中已经集成了虚拟环境创建命令,不需要再使用如virtualenv第三方工具,这也是Python3使用又一大好处,且可以使用绝对路径完成创建,假设创建的虚拟环境名称为t4-env。/opt/python370/python3.7 -m venv /opt/t4-env
很简单,到这里虚拟环境就创建了,创建的同时就自带安装了pip和setuptools包管理工具。但好事多磨,还有一个问题需要等着你去解决。使用pip list查看python3安装的依赖包时出现了一下错误信息:
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
很明显,ssl模块有问题,Python3无法正确使用ssl模块。定位到问题是系统中安装的openssl版本是1.0.1,而Python3.7.0需要的openssl版本是1.0.2或1.1.0以上。所以,先要解决openssl的问题,继续看以下解决方法:
-
openssl下载安装
同样,在不明确升级openssl造成的影响,在不改变系统openssl版本的情况下,下载安装openssl。首先,确认安装了以下组件:
apt-get install ssl apt-get install libssl-dev
其次,下载openssl并安装
cd /opt/soft wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz tar -zxvf openssl-1.1.0h.tar.gz cd openssl-1.1.0 ./config --prefix=/usr/local/openssl --shared make make install /usr/local/openssl/bin/openssl version
执行最后一条命令时提示找不到库文件,错误信息如下:
openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
看来要做个软连接,,,
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1 ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
再执行openssl版本查看命令,发现问题已经解决。成功在系统中安装了另一个1.1.0版本openssl。好,别忘了再回头解决Python3的问题。
-
重新编译Python3并附加openssl
cd /opt/soft/Python3.7.0 ./configure --with-openssl=/usr/local/openssl --prefix=/opt/python370 make clean & make & make install /opt/python37/bin/python3.7 -m venv /opt/t4-env
至此,已经成功创建了Python3.7.0版本的虚拟环境(t4-env)。回顾下解决问题的思路,下载和编译执行版本的Python3,并采用python3官方提供的新的创建env方式,通过执行主程序将虚拟环境创建到指定目录,在创建虚拟环境后,发现pip总提示SSL错误,经检查是openssl版本低于1.0.2的原因,下载openssl并编译到指定目录,再重新指定with-openssl参数编译python3,最后,使用python3创建需要的虚拟环境。通过以上方式实现了可以获取任意指定版本的虚拟环境,且不影响原ubuntu系统python版本,在实践使用中效果明显。