Python 影响虚拟环境的系统上的程序包更新?

Python 影响虚拟环境的系统上的程序包更新?,python,conda,virtual-environment,Python,Conda,Virtual Environment,我在一个虚拟的环境中。我使用哪个python在我的活动终端中验证了这一点,并且可以确认我实际上在一个虚拟环境中。根据官方文档,打印pip列表,应该列出这个虚拟环境中的包。下面是一个输出: Package Version ---------------------------------- ------------------- alabaster 0.7.10

我在一个虚拟的环境中。我使用
哪个python
在我的活动终端中验证了这一点,并且可以确认我实际上在一个虚拟环境中。根据官方文档,打印
pip列表
,应该列出这个虚拟环境中的包。下面是一个输出:

Package                            Version            
---------------------------------- -------------------
alabaster                          0.7.10             
anaconda-client                    1.6.5         
... (truncated)
pip                                10.0.1             

You are using pip version 10.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
当我启动另一个终端时,这次确保我在该虚拟环境之外,并继续升级
pip

pip install --upgrade pip
这样做之后,我验证了系统上我的
pip
包已更新为18.0版。这里是令人困惑的部分:我切换回虚拟环境并使用
pip列表
,而我的虚拟环境中的pip版本现在是pip 18.0

为什么在该环境之外升级pip版本会从10.0.1更新虚拟环境中的pip?我是否误解了虚拟环境的工作原理?我对python并不陌生,但还没有使用过虚拟环境,所以如果它是非常基本的东西,请原谅我。据我所知,使用virtual envs的主要价值在于,我可以升级系统范围的软件包(如pip、flask等),而不会影响虚拟环境中的任何更改。虚拟环境应该是隔离的环境吗

如果重要的话,我使用的是默认的
venv
,而不是
virtualenvwrapper
或任何其他包装工具

问题 tl;dr:问题在于康达。我使用conda,这显然会导致在通过
venv
创建的虚拟环境中管理和安装包时出现一些问题,因为
pip
的本地实例不存在

解决方案A:
conda安装-n myenv pip
其中
myenv
指的是虚拟环境的名称

解决方案B:使用
conda列表
conda创建
以与conda 100%兼容的方式处理环境

/end tl;dr

这是问题的分类。当我使用anaconda版本的python时,我决定查看我环境中的包列表;假设我调用
pip freeze
pip list
,我是否在虚拟环境中都无关紧要。它从conda相应的
站点包
文件夹返回完全相同的包列表

当我在虚拟环境中运行
哪个python
似乎指向python实例的一个独立版本(
acco
是该实例的名称):

然而,在这个虚拟环境中,运行
pip list
pip list--local
仍然会引用相同的包集,这是因为它仍然指向conda版本的包目录(是的,在虚拟环境中,甚至

具体而言,无论是否在虚拟环境内部或外部,
pip列表
都指向安装在
/anaconda3/lib//站点软件包
目录中的软件包:

import sys
sys.prefix
'/Users/Samuel/anaconda3'    

import site
site.getsitepackages()
['/Users/Samuel/anaconda3/lib/python3.6/site-packages']
真正有问题的是,在虚拟环境中,基本上没有安装库。使用pip install-r requirements.txt
requirements.txt'安装,或者如果您尝试安装的任何软件包已经存在于conda目录中,则仅使用普通的旧版
pip install`安装软件包都不起作用。相反,您将得到一条看起来不像是错误的消息,它就停在那里。您试图安装的软件包未安装到本地目录中

# same as pip install Flask==0.12.2
pip install -r requirements.txt 
Requirement already satisfied: Flask==0.12.2 in /Users/Samuel/anaconda3/lib/python3.6/site-packages (from -r requirements.txt (line 1)) (0.12.2)
Requirement already satisfied: Werkzeug>=0.7 in /Users/Samuel/anaconda3/lib/python3.6/site-packages (from Flask==0.12.2->-r requirements.txt (line 1)) (0.12.2)
Requirement already satisfied: Jinja2>=2.4 in /Users/Samuel/anaconda3/lib/python3.6/site-packages (from Flask==0.12.2->-r requirements.txt (line 1)) (2.9.6)
Requirement already satisfied: itsdangerous>=0.21 in /Users/Samuel/anaconda3/lib/python3.6/site-packages (from Flask==0.12.2->-r requirements.txt (line 1)) (0.24)
Requirement already satisfied: click>=2.0 in /Users/Samuel/anaconda3/lib/python3.6/site-packages (from Flask==0.12.2->-r requirements.txt (line 1)) (6.7)
Requirement already satisfied: MarkupSafe>=0.23 in /Users/Samuel/anaconda3/lib/python3.6/site-packages (from Jinja2>=2.4->Flask==0.12.2->-r requirements.txt (line 1)) (1.0)
提醒一下,我们仍然在虚拟环境中使用python来执行python命令(
。/Dropbox/Projects/python/Acco/Acco/bin/python
),而不是conda发行版。此虚拟环境在其隔离的
lib
文件夹中没有软件包,您无法在其中安装任何库,因为
pip
将被“已满足要求”消息停止并退出(或终止其尝试)

这意味着,在该虚拟环境中,尝试运行具有依赖关系的python脚本或应用程序肯定会失败。根据上述示例构建,您的Flask应用程序
app.py
将无法运行,因为它找不到
Flask
。不用说,因为您的虚拟环境没有软件包,它不允许您安装任何软件包


解决方案 解决方案是,如果您使用的是python的conda发行版,请使用
conda list
而不是
pip list
检查系统上安装的软件包,以获得最大的一致性

(acco) Samuels-MacBook-Pro:Acco Samuel$ conda list
# packages in environment at /Users/Samuel/anaconda3:
#
# Name                    Version                   Build  Channel
_ipyw_jlab_nb_ext_conf    0.1.0            py36h2fc01ae_0
_r-mutex                  1.0.0                     mro_2
alabaster                 0.7.10           py36h174008c_0
anaconda                  custom           py36ha4fed55_0
请注意,
conda
告诉您从中列出库的环境。现阶段:

  • 使用
    deactive
  • 使用
    conda create--name acco-python=3.6.3 flask-sqlite
    创建虚拟环境,这里我们使用
    acco
    作为虚拟环境的名称、python的特定版本以及一些可选的其他依赖项
  • 使用源激活acco激活环境
  • 现在,当您在虚拟环境中再次执行
    conda list
    时:

    # packages in environment at /Users/Samuel/anaconda3/envs/acco:
    #
    # Name                    Version                   Build  Channel
    ca-certificates           2018.03.07                    0
    certifi                   2018.8.13                py36_0
    click                     6.7              py36hec950be_0
    flask                     1.0.2                    py36_1
    
    如果您想使用老式的
    requirement.txt
    文件管理应用程序的依赖项,那么最简单的方法是
    conda list--export>requirements.txt
    。从这一点开始,使用
    conda list
    代替
    pip list
    ,使用
    conda create
    以及
    source activate
    代替其
    venv
    对应项

    委员会建议:

    在您的环境、终端窗口或蟒蛇中使用pip 提示,运行:

    conda install -n acco pip 
    source activate acco 
    pip <pip_subcommand>
    
    作为奖励,我仔细检查了一下
    conda install -n acco pip 
    source activate acco 
    pip <pip_subcommand>
    
    (acco) Samuels-MacBook-Pro:Accomplish Samuel$ pip list
    Package      Version
    ------------ ---------
    certifi      2018.8.13
    click        6.7
    Flask        1.0.2
    itsdangerous 0.24
    Jinja2       2.10
    MarkupSafe   1.0
    pip          10.0.1
    setuptools   40.0.0
    Werkzeug     0.14.1
    wheel        0.31.1