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