Mac 下virtualenv pipenv venv conda 区别解读 及 conda 安装 uwsgi 注意事项

两个环境

  1. 版本环境

    1. 版本环境的意思是可以控制当前python的全局版本号以及所有跟此版本号有关的lib

  2. 虚拟环境

    1. 为了隔离不同项目所依赖的python包,避免所有的项目依赖的包都放在同一个文件夹下面,造成版本依赖混乱,导致删不好删,改不好改,为了隔离不同项目的依赖包,对类似爬虫,人工智能、web等不同项目的包给予隔离而分离出来的环境,叫虚拟环境

  3. 两者混淆点

    1. 用不同的Python解释器,就可以创造出来两个Python版本的虚拟环境,例如用Python2生成的虚拟环境,就是基于Python2解释器的虚拟环境,用Python3生成的就是基于Python3解释器的虚拟环境,在使用 Pip安装包时,会对 Python 解释器版本进行区分和隔离,这样让初入门 Python的新手,总觉得两者有不可分割的关系,但对于同一个操作系统,如何有多个 Python 解释器,从 PHP 转过来的人估计不好理解,PHP 环境隔离还是挺麻烦的(仍然可以做到 wamp 就把 PHP分离了),从 Java 转过来的却很容易理解,因为 JDK 可以有多个,放在不同的位置,同理 Python 解释器也可以有多个,放在不同的位置,只需要用这些解释器来创建虚拟环境,就可以让不同的虚拟环境依赖不同 Python 版本的解释器。

软件包 | 包?

  1. 两者都可用pip来进行安装,只在虚拟环境情况下有较大分别

  2. Python的软件包:是依赖于Python解释器的软件包,本身可能要编译以及执行,执行过程中可能调用Python解释器依赖的其他包,如果全局环境,例如使用 python 命令时,python 的版本号和虚拟环境的版本号不一致,则导致 Python 软件包报错,因为Pip安装时是按照虚拟环境的 Python 解释器版本安装的,执行时却是全局 Python 解释器执行,两者代码不兼容,则报错。

  3. 包:不是一个独立软件,只是在运行环境中,被项目加载并执行的代码集,只在虚拟环境启动时才被执行,但因为执行时会主动切换到虚拟环境中,所以不存在因为兼容问题报错的情况。

虚拟环境

  1. 虚拟环境的python解释器不是一个实际解释器,venv也不是完整的python解释器环境,可以理解为原基础环境的一个快捷方式,最终运行起来后,还是由原来生成虚拟环境的解释器进行解释,只不过在 form import 包时,是从虚拟环境的site-package中提取,而不是从Python 解释器根目录的site-package中提取,所以就保证了包的隔离。

  2. 因此vitualenv 解决的是虚拟环境的问题,如果操作系统只有python3,那么virtualenv只是为了不同项目而创建的不同虚拟环境而已,并不是拷贝了原始解释器以及解释器的依赖的各类包,虚拟环境中的解释器也无法代替原始解释器,因此通过pip安装的包里如果本身就是软件,而这个软件要依赖原始解释器,那么虚拟环境是运行不起来的,这个要明确,会报一些找不到依赖包的错误,因此非纯粹的 python 包(如uwsgi)不要在虚拟环境中用pip来安装,容易造成一种可以成功安装并执行的错觉

conda 和 virtualenv的区别

  1. virtualenv 主要工作是为不同项目分离不同的虚拟环境,至于虚拟环境依赖的python版本,virtualenv 是控制不了的,因为虚拟环境的解释器的快捷方式指向他的创造者

  2. conda 比 virtualenv 更强的一点在于,能将整个环境在执行 conda activate pythonXXX 时既创建了有个新的虚拟环境,也基于了一种版本环境

  3. python -m venv XXX 命令是 python3 编译器自带的一个创建虚拟环境的命令,与 virtualenv 的唯一区别是 virtualenv 还支持 python2

  4. conda 和 virtualenv 更强的一个功能是可以为这个新创建的版本环境装软件,对于像 uwsgi 这种软件来说,要基于原始 python 解释器进行安装,而不是在虚拟环境中,因此这里强调一点,conda 创建的既是一个虚拟环境又是一个独立的版本环境,在这个版本环境中,一切都是隔离独立的,这个是非常强的,因此 conda install uwsgi 可以为这个版本环境安装 uwsgi,当你用 pip install uwsgi 时,会安装到 Mac 原生环境根目录下,原因是 pip 并未做版本环境隔离,所以在版本环境中,使用 pip install uwsgi 时,编译器采用 mac 最原始的 python 解释器执行,这就造成版本错误,所以还是要用 conda  install uwsgi -c conda-forge 来安装

  5. conda install uwsgi 和 pip install uwsgi 两者主要有以下几点区别:
    
    安装的 Python 环境不同。pip 默认为系统 Python,conda 允许创建独立的 Python 环境。
    管理方案不同。pip 是 Python 的包管理器,conda 是跨语言的包环境管理器。
    依赖处理不同。pip 只看 Python 依赖,conda 可以一并处理非 Python 依赖。
    包来源不同。pip 默认 PyPI 源,conda 可指定不同渠道和来源。
    isolation 隔离性。conda 环境可以实现不同 Python 版本和包之间的隔离。
    具体到本题:
    
    pip install uwsgi 会使用系统默认 Python 解释器和对应的 site-packages 路径进行安装。
    
    而 conda install uwsgi 会使用conda环境内的 Python 解释器和 site-packages 进行安装,与系统 Python 隔离。
    
    这是因为 conda 环境有自己独立的 Python 解释器和包路径,所以可以和系统 Python 完全隔离开来,避免冲突。
    
    所以两者的 Python 环境和依赖管理方式不同,会导致 uwsgi 的安装使用不同的 Python 解释器和依赖。
  6. 其他类似的 uwsgi 的软件包都应该采用 conda 进行安装,这样能保证这些执行软件的依赖被锁定在当前 python 的虚拟环境中

虚拟环境和版本环境不同导致的问题

  1. 如果虚拟环境用的是 python3.7 其安装的依赖包就是 3.7 的,而使用版本环境 3.8 来运行,有可能有包版本冲突问题

  2. 所以虚拟环境要和版本环境的解释器版本一致,那个版本环境创建的虚拟环境,就按照那个版本环境来运行 uwsgi,否则会出现版本不兼容,报代码错误问题

conda环境下安装并执行uwsgi正确方式

  1. 采用 conda 创建的版本环境 python3.8 中,切换到 venv 虚拟环境下,执行 pip install -r requirement.txt 安装所有依赖包

  2. deactivate venv 环境,conda activate python38 切到 conda 版本环境中

  3. 执行 conda install -c conda-forge uwsig (-c 是渠道的意思,conda-forge 这个镜像渠道有很全的软件包)

  4. 然后将配置文件 uwsig.ini——>home 指向虚拟目录

[uwsgi]
# Django manage.py 所在文件夹路径
chdir = /Users/senwang/workspace/python-api/
module = plus.wsgi:application
# 启用master进程管理
master = true
# 绑定的 UNIX socket
http = 127.0.0.1:8888
# uwsgi的进程数
processes = 1
# 最大请求处理数,之后重新生成进程
max-requests = 5000
# 退出时清理环境
vacuum = true
# python的安裝路径
home=/Users/senwang/workspace/python-api/venv/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值