首页 > 解决方案 > 可以在没有 **any** 默认环境的情况下安装 Anaconda 吗?

问题描述

背景

我想避免“意外”在默认环境中工作。

我希望始终有一个等效于 arequirements.txtpackage.json文件的可用文件,既可以清楚地将一个项目与另一个项目分开,也可以轻松回顾已安装的内容(以及它的版本)。


但我主要在数据科学/分析领域工作,主要使用 Python。

因此,我使用AnacondapipHomebrew(我有一台 Mac)。只依赖一个包管理器会很棒,而且许多人支持一种或一种方法来完成此任务。事实是,截至目前(2018 年 9 月),不可能在任何广泛的主题中工作并至少避免一些混合。


把我的目光放得更低更现实,我只是想确保尽可能不存在默认环境,以使与他人一起处理项目变得更干净、更容易。

据我所知,Homebrew 中根本没有环境的概念。Conda 当然有环境,但它首先设置一个默认环境,然后才能创建任何其他环境。

问题

有没有什么方法可以在没有任何默认环境的情况下安装 Anaconda ,这样我就必须一直这样做source activate <my_env>?如果是这样,我该怎么做?

除此之外,实现我想要的最好的建议是什么,即永远不要在不清楚我的依赖项是什么的环境中意外工作,认识到我主要但不只是在谈论使用 Python?

(请不要建议我在安装软件包时“小心”。是的,我明白这一点。但我试图通过尽可能困难或不可能做出错误的选择来先发制人地小心。如果我有例如,没有默认环境,那么pip在我找到一个环境之前甚至都不会工作,因为在我的正常环境中找不到它。)

标签: pythonpipanacondahomebrewpackage-managers

解决方案


我认为您最好的选择是简单地使用虚拟环境并在需要时安装依赖项,然后随着工作的进行签入和签出虚拟环境。您可以在处理不同项目时创建不同的虚拟环境,并将其相应的 requirements.txt 文件留在 python 在安装虚拟环境时创建的目录中。假设我有 python3.5.2 作为我正常的首选 python 包(因为我有)。

使用 python3.5 让我们进入一个只有基本 python3.5(没有安装依赖项)的虚拟环境。去做这个:

[dkennetz@node venv_test]$ python -m venv my_SO_project
[dkennetz@node venv_test]$ ls
my_SO_project

所以我们看到,python 已经创建了一个目录来存放我的虚拟环境,但是我的虚拟环境没有被用作我的默认 python。为此,我们必须激活它:

[dkennetz@node venv_test]$ source ./my_SO_project/bin/activate

所以我的外壳现在看起来像这样:

(my_SO_project) [dkennetz@nodecn201  venv_test]$

当我们在这里时,让我们看看我们的要求是什么样的:

(my_SO_project) [dkennetz@nodecn201  venv_test]$ pip freeze > requirements.txt
(my_SO_project) [dkennetz@nodecn201  venv_test]$ ls -alh
drwxr-x---  3 dkennetz blank 4.0K Oct  9 09:52 .
drwxr-x--- 93 dkennetz root      16K Oct  9 09:40 ..
drwxr-x---  5 dkennetz blank 4.0K Oct  9 09:47 my_SO_project
-rwxr-x---  1 dkennetz blank    0 Oct  9 09:47 requirements.txt

使用空白隐藏组名,但正如我们所见,我们的 requirements.txt 文件大小是空的,这意味着这个虚拟环境没有依赖关系。它纯粹是python3.5。现在让我们继续安装 pandas,看看我们的依赖关系如何变化。

(my_SO_project) [dkennetz@nodecn201  venv_test]$ pip install pandas
(my_SO_project) [dkennetz@nodecn201  venv_test]$ pip freeze > requirements.txt
(my_SO_project) [dkennetz@nodecn201  venv_test]$ more requirements.txt
numpy==1.15.2
pandas==0.23.4
python-dateutil==2.7.3
pytz==2018.5
six==1.11.0
(my_SO_project) [dkennetz@nodecn201  venv_test]$ wc -l requirements.txt
5 requirements.txt

假设我们已经在环境中编写了一些代码,并且我们不想再做任何工作,所以我们执行最后一个 pip freeze > requirements.txt 并离开:

(my_SO_project) [dkennetz@nodecn201  venv_test]$ deactivate
[dkennetz@nodecn201  venv_test]$ pip freeze > requirements_normal.txt
[dkennetz@nodecn201  venv_test]$ wc -l requirements_normal.txt
82 requirements_normal.txt

弹出了更多的依赖项,但在我们的正常环境中没有任何变化,在我们的虚拟环境中也没有任何变化。现在假设我们已经休息了一天,并希望回到我们昨天创建的 SO_project。那么这很容易:

[dkennetz@nodecn201  venv_test]$ ls -alh
drwxr-x---  3 dkennetz blank 4.0K Oct  9 10:01 .
drwxr-x--- 93 dkennetz root      16K Oct  9 09:40 ..
drwxr-x---  5 dkennetz blank 4.0K Oct  9 09:47 my_SO_project
-rwxr-x---  1 dkennetz blank   77 Oct  9 09:56 requirements.txt
-rwxr-x---  1 dkennetz blank 1.3K Oct  9 10:01 requirements_normal.txt
[dkennetz@nodecn201  venv_test]$ source ./my_SO_project/bin/activate
(my_SO_project) [dkennetz@nodecn201  venv_test]$ 

让我们看看我们离开的地方,(我们应该只安装 pandas,让我们覆盖旧的 requirements_file):

(my_SO_project) [dkennetz@nodecn201  venv_test]$ pip freeze > requirements.txt
(my_SO_project) [dkennetz@nodecn201  venv_test]$ more requirements.txt
numpy==1.15.2
pandas==0.23.4
python-dateutil==2.7.3
pytz==2018.5
six==1.11.0

很酷,所以现在我们知道我们就在我们离开的地方。只是一个公平的警告,我在我的根 python 包上安装了 pandas,但我没有的是 awscli(亚马逊网络服务命令行界面)。假设我出于某种原因想要在我的包裹中使用它:

(my_SO_project) [dkennetz@nodecn201  venv_test]$ pip install awscli
(my_SO_project) [dkennetz@nodecn201  venv_test]$ pip freeze > requirements.txt
(my_SO_project) [dkennetz@nodecn201  venv_test]$ wc -l requirements.txt
15 requirements.txt
(my_SO_project) [dkennetz@nodecn201  venv_test]$ deactivate
[dkennetz@nodecn201  venv_test]$ ls
my_SO_project  requirements.txt  requirements_normal.txt
[dkennetz@nodecn201  venv_test]$ pip freeze > requirements_normal.txt
[dkennetz@nodecn201  venv_test]$ wc -l requirements_normal.txt
82 requirements_normal.txt

所以我们现在看到安装 awscli 并没有改变我们的 python 包,但是它改变了我们的 venv:

[dkennetz@nodecn201  venv_test]$ more requirements_normal.txt
appdirs==1.4.3
arrow==0.7.0
attrdict==2.0.0
avro-cwl==1.8.4
...
[dkennetz@nodecn201  venv_test]$ more requirements.txt
awscli==1.16.29
botocore==1.12.19
colorama==0.3.9
docutils==0.14
...

最后,假设您已经完全在您的虚拟机内部开发了一个超级酷的数据科学包,并且您已经使它可以 pip 安装。快速简便的方法是:

[dkennetz@nodecn201  venv_test]$ pip install -r requirements.txt

现在,每次安装“新程序”时,您都可以将其用作您的包列表,更好的是您知道您需要的每个 python 包,因为它们是您环境中唯一包含的包。

综上所述,没有理由每次与新人一起开始一个新项目时都不能这样做。如果你想在你曾经使用过的每个虚拟环境中都有 anaconda,请正常安装 anaconda:

[dkennetz@nodecn201  venv_test]$ ./Anaconda-1.6.0-Linux-x86_64.sh
[dkennetz@nodecn201  venv_test]$ source /home/dkennetz/anaconda3/bin/activate
#You will be in your anaconda environment now
(base) [dkennetz@nodecn201  venv_test]$ pip freeze > anaconda_reqs.txt

假设您在第一个之后现在已经启动了 my_SO_project2,并且您希望确保此包中有 anaconda。以与上次相同的方式创建新的 venv。一旦进入,只需安装 anaconda 所需的所有依赖项,您将拥有一个全新的 anaconda 虚拟环境:

(my_SO_project2) [dkennetz@nodecn201  venv_test]$ pip install -r anaconda_reqs.txt

你的新 venv 开始时是一个全新的环境,只安装了 anaconda。

我希望这可以澄清我在评论中所说的内容,并且对您有所帮助。


推荐阅读