两个环境
-
版本环境
-
版本环境的意思是可以控制当前python的全局版本号以及所有跟此版本号有关的lib
-
-
虚拟环境
-
为了隔离不同项目所依赖的python包,避免所有的项目依赖的包都放在同一个文件夹下面,造成版本依赖混乱,导致删不好删,改不好改,为了隔离不同项目的依赖包,对类似爬虫,人工智能、web等不同项目的包给予隔离而分离出来的环境,叫虚拟环境
-
-
两者混淆点
-
用不同的Python解释器,就可以创造出来两个Python版本的虚拟环境,例如用Python2生成的虚拟环境,就是基于Python2解释器的虚拟环境,用Python3生成的就是基于Python3解释器的虚拟环境,在使用 Pip安装包时,会对 Python 解释器版本进行区分和隔离,这样让初入门 Python的新手,总觉得两者有不可分割的关系,但对于同一个操作系统,如何有多个 Python 解释器,从 PHP 转过来的人估计不好理解,PHP 环境隔离还是挺麻烦的(仍然可以做到 wamp 就把 PHP分离了),从 Java 转过来的却很容易理解,因为 JDK 可以有多个,放在不同的位置,同理 Python 解释器也可以有多个,放在不同的位置,只需要用这些解释器来创建虚拟环境,就可以让不同的虚拟环境依赖不同 Python 版本的解释器。
-
软件包 | 包?
-
两者都可用pip来进行安装,只在虚拟环境情况下有较大分别
-
Python的软件包:是依赖于Python解释器的软件包,本身可能要编译以及执行,执行过程中可能调用Python解释器依赖的其他包,如果全局环境,例如使用 python 命令时,python 的版本号和虚拟环境的版本号不一致,则导致 Python 软件包报错,因为Pip安装时是按照虚拟环境的 Python 解释器版本安装的,执行时却是全局 Python 解释器执行,两者代码不兼容,则报错。
-
包:不是一个独立软件,只是在运行环境中,被项目加载并执行的代码集,只在虚拟环境启动时才被执行,但因为执行时会主动切换到虚拟环境中,所以不存在因为兼容问题报错的情况。
虚拟环境
-
虚拟环境的python解释器不是一个实际解释器,venv也不是完整的python解释器环境,可以理解为原基础环境的一个快捷方式,最终运行起来后,还是由原来生成虚拟环境的解释器进行解释,只不过在 form import 包时,是从虚拟环境的site-package中提取,而不是从Python 解释器根目录的site-package中提取,所以就保证了包的隔离。
-
因此vitualenv 解决的是虚拟环境的问题,如果操作系统只有python3,那么virtualenv只是为了不同项目而创建的不同虚拟环境而已,并不是拷贝了原始解释器以及解释器的依赖的各类包,虚拟环境中的解释器也无法代替原始解释器,因此通过pip安装的包里如果本身就是软件,而这个软件要依赖原始解释器,那么虚拟环境是运行不起来的,这个要明确,会报一些找不到依赖包的错误,因此非纯粹的 python 包(如uwsgi)不要在虚拟环境中用pip来安装,容易造成一种可以成功安装并执行的错觉
conda 和 virtualenv的区别
-
virtualenv 主要工作是为不同项目分离不同的虚拟环境,至于虚拟环境依赖的python版本,virtualenv 是控制不了的,因为虚拟环境的解释器的快捷方式指向他的创造者
-
conda 比 virtualenv 更强的一点在于,能将整个环境在执行 conda activate pythonXXX 时既创建了有个新的虚拟环境,也基于了一种版本环境
-
python -m venv XXX 命令是 python3 编译器自带的一个创建虚拟环境的命令,与 virtualenv 的唯一区别是 virtualenv 还支持 python2
-
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 来安装
-
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 解释器和依赖。
-
其他类似的 uwsgi 的软件包都应该采用 conda 进行安装,这样能保证这些执行软件的依赖被锁定在当前 python 的虚拟环境中
虚拟环境和版本环境不同导致的问题
-
如果虚拟环境用的是 python3.7 其安装的依赖包就是 3.7 的,而使用版本环境 3.8 来运行,有可能有包版本冲突问题
-
所以虚拟环境要和版本环境的解释器版本一致,那个版本环境创建的虚拟环境,就按照那个版本环境来运行 uwsgi,否则会出现版本不兼容,报代码错误问题
conda环境下安装并执行uwsgi正确方式
-
采用 conda 创建的版本环境 python3.8 中,切换到 venv 虚拟环境下,执行 pip install -r requirement.txt 安装所有依赖包
-
deactivate venv 环境,conda activate python38 切到 conda 版本环境中
-
执行 conda install -c conda-forge uwsig (-c 是渠道的意思,conda-forge 这个镜像渠道有很全的软件包)
-
然后将配置文件 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/