Linux系统 05 python环境配置02 之 virtualenv与virtualenvwrappe以及freeze

思考:在使用 Python 开发的过程中,工程多了以后,会不会遇到如下问题:

  • 不同的工程依赖不同版本的库的问题,如何让一台机器同时跑不同的python或django版本;
  • 开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难。
  • 如果想让各个开发人员的环境一致, 怎样能够简单进行管理.

此时,我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。

这里,就要隆重介绍 virtualenv,virtualenvwrapper以及freeze

一个可以帮助我们管理不同 Python 环境的绝好工具。

virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境。

Linux下安装、配置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解释器的环境,并且这个虚拟环境的创建,非常快速,简洁,好用

  •     1.  新建虚拟环境  venv1 运行django1.11.11
  •     2.  django2运行在venv2 

我们在同一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。要解决此问题,只能引入虚拟环境, 让各虚拟环境可以和系统环境隔离安装其他版本的软件

virtualenv安装配置

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

访问结果:

pip freeze和 requirements.txt

说明:由于 pip freeze 与 pip list 内容区别不大,所以,若想要用其作为工程依赖包列表,一定要配合 Python 虚拟环境 virtualenv 使用。

有时,我们为了代码稳定、代码迁移等,需要获取当前 Python 工程依赖包的安装列表。这个列表要包括需要安装什么包、以及包的版本。这便是:requirements.txt

使用 pip freeze 会输出所有在本地已安装的包(但不包括 pipwheelsetuptools 等自带包),若需要输出内容与 pip list 一致,需使用 pip freeze -all


步骤1. 通过命令 pip3 freeze > requirements.py 导出当前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 

Linux下安装virtualenvwrapper 

完整官网介绍:https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html

virtualenv的缺点 

virtualenv的一个最大的缺点就是:

每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,这就需要我们记住每个虚拟环境所在的目录。如果你忘记了虚拟环境放在哪。。。怎么办?

  • 一种可行的解决方案是,将所有的虚拟环境目录全都集中起来,例如/opt/all_venv/,并且针对不同的目录做不同的事。
  • 使用virtualenvwrapper管理你的虚拟环境(virtualenv),其实他就是统一管理虚拟环境的目录,并且省去了source的步骤。      

virtualenvwrapper安装使用步骤

虚拟环境管理之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 


[root@MiWiFi-R4CM-srv ~]# source ~/.bashrc            # 使生效

[root@MiWiFi-R4CM-srv ~]# mkvirtualenv  env_order_V200722
created virtual environment CPython3.6.7.final.0-64 in 818ms
  creator CPython3Posix(dest=/HOME/env/env_order_V200722, clear=False, global=False)
  seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/root/.local/share/virtualenv/seed-app-data/v1.0.1)
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
-bash: /..../python3/bin: Is a directory
[root@MiWiFi-R4CM-srv ~]# lsvirtualenv
env_order_V200722
=================
-bash: /usr/local/python3/bin: Is a directory
[root@MiWiFi-R4CM-srv ~]# workon env_order_V200722
-bash: /usr/local/python3/bin: Is a directory

(env_order_V200722) [root@localhost ~]#             # 成功进入虚拟环境

 

步骤4. 开始使用virtualenvwrapper,创建一个venv1

  • mkvirtualenv  venv1       # 这一步会创建venv1,并且放入到WORKON_HOME变量定义目录下,并且自动激活虚拟环境
  • lsvirtualenv                     #查看当前机器所有的虚拟环境
  • deactivate                         #退出虚拟环境
  • workon   venv2                   #用于激活虚拟环境,也用于在多个虚拟环境中来回切换,
  • rmvirtualenv venv3                   #用于删除虚拟环境,也会自动找到所有的虚拟环境
  • cdvirtualenv                     #用于直接进入虚拟环境的目录,此命令需要激活虚拟环境
  • cdsitepackages               #用于直接进入pip3软件包的目录

友情提醒:  使用了virtualenvwrapper 就不需要再手动安装virtualenv了.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值