思考:在使用 Python
开发的过程中,工程多了以后,会不会遇到如下问题:
此时,我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。
这里,就要隆重介绍 virtualenv
,virtualenvwrapper以及freeze
一个可以帮助我们管理不同 Python
环境的绝好工具。
virtualenv
可以在系统中建立多个不同并且相互不干扰的虚拟环境。
virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。
现在有个需求,我现在有两个项目,一个得运行于django1.1.11 ,还有一个版本得跑在django2.0上
python3 manage.py runserver 0.0.0.0:8000 #我得调用django的模块, pip3 list ,运行了django1.11.11
python3 manage.py runserver 0.0.0.0:9000 # 还得调用django的模块,我想运行django2.0
能调用一个解释器吗?
1.买俩电脑,装俩python3
2.装多个python解释器,在当前linux下,安装一个python3.6 安装一个python3.7
python3.6 manage.py runserver 0.0.0.0:8000 #我得调用django的模块, pip3 list ,运行了django1.11.11
python3.7 manage.py runserver 0.0.0.0:9000 # 还得调用django的模块,我想运行django2.0
3. 使用虚拟解释器环境,可以在一台服务器上,运行多个python解释器的环境,并且这个虚拟环境的创建,非常快速,简洁,好用
我们在同一Linux下同时安装django1.11.11和2.0, 发现系统只保留了后安装的django。
pip3 install -i https://pypi.douban.com/simple django==1.11.11
pip3 install -i https://pypi.douban.com/simple django==2.0
因此, 同一环境中只能有一个django。要解决此问题,只能引入虚拟环境, 让各虚拟环境可以和系统环境隔离安装其他版本的软件
Linux下的虚拟环境安装(virtualenv),以宿主机的python解释器为主体,然后复制的多个虚拟环境
步骤1. 通过pip3安装virtualenv虚拟环境
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv //清华源安装
步骤2. 通过virtualenv命令,创建第一个新的虚拟环境
virtualenv ven11 # 创建隔离虚拟环境
virtualenv --system-site-packages ven12 # 创建和宿主系统相同的虚拟环境
virtualenv --no-site-packages --python=python3 venv1
参数解释
--no-site-packages 创建一个干净,隔离宿主机环境的虚拟环境
--python=python3 #指定你的虚拟环境,以哪个解释器为base环境,我的这个是以我机器上的python3解释器为主体
步骤3. 激活虚拟环境,切换宿主机环境,进入虚拟环境的环境变量
source /opt/all_env/venv1/bin/activate # 需要找到虚拟环境文件中的activate
激活虚拟环境后,linux会切换到虚拟环境:(虚拟环境名)[ ****]#
步骤4. 检查环境变量PATH,检查是否正确激活了虚拟环境
(venv1) [root@s14linux ~ 12:03:48]#echo $PATH
/opt/all_env/venv1/bin:/opt/python36/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:
步骤5. 检查你当前的python3和pip3来自于哪里
which python3
(venv1) [root@s14linux ~ 12:04:12]#which python3
/opt/all_env/venv1/bin/python3
which pip3
步骤6. 查看虚拟环境的python环境配置, 隔离环境只有pip setuptools wheel三个包。
(venv1) [root@MiWiFi-R4CM-srv all_env]# pip list //或者使用pip3 list
Package Version
---------- -------
pip 20.0.2
setuptools 46.0.0
wheel 0.34.2
步骤7. 使用venv1虚拟环境,安装一个django1.11.11
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.11
# 安装完成后可以查询django安装版本
(venv1) [root@MiWiFi-R4CM-srv all_env]# pip list
Package Version
---------- -------
Django 1.11.11
pip 20.0.2
pytz 2019.3
setuptools 46.0.0
wheel 0.34.2
测试:运行在一个服务器上,运行两个django版本
1.宿主机python下运行django2.0
2.虚拟环境下运行django1.11.11
常用命令
linux下python的django项目常用命令
django-admin startproject mysite # 创建工程mysite
django-admin startapp app01 # 创建一个app
python3 manage.py runserver 0.0.0.0:8000 # 启动运行一个django项目, 浏览器输入地址为虚拟机ip
步骤8. 退出虚拟环境
deactivate
不要使用宿主机的python环境
1.安装好两个虚拟环境 venv1 venv2
2.分别在venv1中启动django2.0
venv2中启动django1.1.11
3.展示两个不同的django欢迎页面
例如创建e1隔离虚拟环境安装django1.1.11:
创建项目过程如下:
(e1) [root@MiWiFi-R4CM-srv all_env]# django-admin startproject mysite (e1) [root@MiWiFi-R4CM-srv all_env]# ll 总用量 0 drwxr-xr-x. 4 root root 46 3月 18 23:31 e1 drwxr-xr-x. 3 root root 37 3月 18 23:39 mysite drwxr-xr-x. 4 root root 46 3月 18 23:09 TestEnv1 (e1) [root@MiWiFi-R4CM-srv all_env]# vim mysite/settings.py (e1) [root@MiWiFi-R4CM-srv all_env]# pwd /opt/all_env (e1) [root@MiWiFi-R4CM-srv all_env]# ll 总用量 0 drwxr-xr-x. 4 root root 46 3月 18 23:31 e1 drwxr-xr-x. 3 root root 37 3月 18 23:43 mysite drwxr-xr-x. 4 root root 46 3月 18 23:09 TestEnv1 (e1) [root@MiWiFi-R4CM-srv all_env]# cd mysite/ (e1) [root@MiWiFi-R4CM-srv mysite]# ll 总用量 4 -rwxr-xr-x. 1 root root 804 3月 18 23:39 manage.py drwxr-xr-x. 2 root root 74 3月 18 23:39 mysite (e1) [root@MiWiFi-R4CM-srv mysite]# vim mysite/settings.py (e1) [root@MiWiFi-R4CM-srv mysite]# ll 总用量 4 -rwxr-xr-x. 1 root root 804 3月 18 23:39 manage.py drwxr-xr-x. 2 root root 74 3月 18 23:46 mysite (e1) [root@MiWiFi-R4CM-srv mysite]# django-admin startapp app01 (e1) [root@MiWiFi-R4CM-srv mysite]# ll 总用量 4 drwxr-xr-x. 3 root root 123 3月 18 23:47 app01 -rwxr-xr-x. 1 root root 804 3月 18 23:39 manage.py drwxr-xr-x. 2 root root 74 3月 18 23:46 mysite (e1) [root@MiWiFi-R4CM-srv mysite]# vim mysite/settings.py (e1) [root@MiWiFi-R4CM-srv mysite]# vim mysite/urls.py (e1) [root@MiWiFi-R4CM-srv mysite]# cat mysite/urls.py """mysite URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/', views.hello), ] (e1) [root@MiWiFi-R4CM-srv mysite]# vim app01/views.py (e1) [root@MiWiFi-R4CM-srv mysite]# cat app01/views.py from django.shortcuts import render, HttpResponse def hello(request): return HttpResponse('hello ***') # Create your views here. (e1) [root@MiWiFi-R4CM-srv mysite]# python python python2.7-config python3.6 python3.6m-config python2 python2-config python3.6-config python3-config python2.7 python3 python3.6m python-config (e1) [root@MiWiFi-R4CM-srv mysite]# vim app01/views.py (e1) [root@MiWiFi-R4CM-srv mysite]# python3 manage.py runserver 0.0.0.0:8080 Performing system checks... System check identified no issues (0 silenced). You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. March 18, 2020 - 16:04:31 Django version 1.11.11, using settings 'mysite.settings' Starting development server at http://0.0.0.0:8080/ Quit the server with CONTROL-C. [18/Mar/2020 16:04:44] "GET /hello/ HTTP/1.1" 200 16
访问结果:
服务器环境之保证本地和服务器开发环境一致性的配置可以使用freeze:
步骤1. 通过命令导出当前python解释器的pip3包环境
pip3 freeze > requirements.py #这个requirements.py文件,就存放了正常运转的开发软件依赖包的信息
# 实际操作情况如下:
(e1) [root@MiWiFi-R4CM-srv all_env]# pip3 freeze > requirement.py
(e1) [root@MiWiFi-R4CM-srv all_env]# ll
总用量 4
drwxr-xr-x. 4 root root 46 3月 18 23:31 e1
drwxr-xr-x. 4 root root 46 3月 19 06:29 e2
drwxr-xr-x. 4 root root 68 3月 19 00:04 mysite
-rw-r--r--. 1 root root 124 3月 19 06:39 requirement.py
drwxr-xr-x. 4 root root 46 3月 18 23:09 TestEnv1
(e1) [root@MiWiFi-R4CM-srv all_env]# cat requirement.py
click==7.1.1
Django==1.11.11
Flask==1.1.1
itsdangerous==1.1.0
Jinja2==2.11.1
MarkupSafe==1.1.1
pytz==2019.3
Werkzeug==1.0.0
步骤2. 将此requirements.py文件传到服务器上或需要同步的虚拟环境中
上传办法1. yum install lrzsz
这个lrzsz软件提供了两个命令
1. sz (发送,下载) 从linux往windows下载
sz 你想传输的文件名字
2. rz(接收,上传) 从windows往linux上传
rz 空格键 # 按下Enter后会弹出文件框
上传办法2. 通过xftp工具 (公司一般用xftp工具)
步骤3. 在另一需要同步环境下执行命令进行一致性环境安装配置。为了安装快速,建议使用源安装。
pip install -r requirements.py (官网安装)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.py (源安装)
步骤4: 执行命令后检查环境配置用会发现新的环境信息已经一致.
pip list
# 以下为检查过程
(e2) [root@MiWiFi-R4CM-srv all_env]# pip list
Package Version
------------ -------
click 7.1.1
Django 1.11.11
Flask 1.1.1
itsdangerous 1.1.0
Jinja2 2.11.1
MarkupSafe 1.1.1
pip 20.0.2
pytz 2019.3
setuptools 46.0.0
Werkzeug 1.0.0
wheel 0.34.2
完整官网介绍:https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html
virtualenv的缺点
virtualenv
的一个最大的缺点就是:
每次开启虚拟环境之前要去虚拟环境所在目录下的 bin
目录下 source
一下 activate
,这就需要我们记住每个虚拟环境所在的目录。如果你忘记了虚拟环境放在哪。。。怎么办?
虚拟环境管理之virtualenvwrapper安装使用步骤:
步骤1. 退出虚拟环境, 下载安装 virtualenvwrapper
pip3 install -i https://pypi.douban.com/simple virtualenvwrapper #源安装
# 实际操作
[root@MiWiFi-R4CM-srv all_env]# cd ~ # 切换到真宿主环境
[root@MiWiFi-R4CM-srv ~]# pip3 install -i https://pypi.douban.com/simple virtualenvwrapper # 豆瓣源安装
Looking in indexes: https://pypi.douban.com/simple
Collecting virtualenvwrapper
Downloading
******
Successfully installed pbr-5.4.4 stevedore-1.32.0 virtualenv-clone-0.5.3 virtualenvwrapper-4.8.4
[root@MiWiFi-R4CM-srv ~]# virtualenv # 按Tab键
virtualenv virtualenvwrapper_lazy.sh
virtualenv-clone virtualenvwrapper.sh
[root@MiWiFi-R4CM-srv ~]# find / -name virtualenvwrapper # 查找virtualenvwrapper安装位置
/opt/python36/lib/python3.6/site-packages/virtualenvwrapper
步骤2. 执行脚本,让当前机器支持virtualenvwrapper,但是有一个问题,重启后,退出会话后,这个功能就失效了。
步骤3. 配置全局变量,让每次登陆linux时候,就加载这个virtualenvwrapper.sh脚本文件,使得virtualenvwrapper这个工具生效
打开这个用户环境变量配置文件,写入以下信息,export 就是读取一段shell变量的命令
vim ~/.bashrc #这个文件代表用户环境变量,每次登陆时候加载
# 设置virtualenv的统一管理目录Envs,生成的虚拟环境会在/root/Envs目录下
export WORKON_HOME=~/Envs
# 添加virtualenvwrapper的参数,生成干净隔绝的环境,有的版本不加--no-site-packages参数
#export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=''
# 指定python解释器,(这个得根据你自己机器环境来配)
export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3.6
# 执行virtualenvwrapper安装脚本,这个脚本放在你的python3.6解释器bin目录下
source /opt/python36/bin/virtualenvwrapper.sh
#读取文件,使得生效,此时已经可以使用virtalenvwrapper
#source ~/.bashrc
配置示例:
当前系统环境是配置virtualenvwrapper 4.8.4版本, vim ~/.bashrc的内容如下:
[root@MiWiFi-R4CM-srv ~]# cat ~/.bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi export WORKON_HOME=~/Envs export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='' #无参数 export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3.6 source /opt/python36/bin/virtualenvwrapper.sh
步骤4. 开始使用virtualenvwrapper,创建一个venv1
友情提醒: 使用了virtualenvwrapper 就不需要再手动安装virtualenv了.