可以在没有**任何**默认环境的情况下安装 Anaconda 吗?

Possible to install Anaconda without **any** default environment?

背景

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

我希望始终有一个等同于 requirements.txtpackage.json 的可用文件,既可以清楚地将一个项目与另一个项目分开,也可以方便地回头看看安装了什么(以及它的版本)。


但我主要从事数据科学/分析领域的工作,主要从事 Python。

因此,我使用 Anaconda, pip, and Homebrew (I have a Mac). It would be great to rely upon just one package manager, and many folks espouse or another 来完成此操作。事实是,截至目前(2018 年 9 月),不可能在任何主题范围内工作并至少避免一些混合。


我的眼光放得更低,更现实,我只是想确保尽可能没有默认环境,以便更干净、更轻松地与他人合作开展项目.

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

问题

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

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

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

我认为最好的办法是简单地使用虚拟环境并在必要时安装依赖项,然后随着工作的进行签入和签出虚拟环境。您可以在处理不同的项目时创建不同的虚拟环境,并将它们相应的 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

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

(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
...

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

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

你现在可以在每次你的 "new program" 被 pip 安装时使用它作为你的包列表,更好的是你知道你需要的每个 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。

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

首先我会从我的系统中删除python

编辑:正如评论中所指出的,这在 macos 中不是一个好主意。我只会在 Docker 容器中使用这种方法。但是,如果你确实有 docker,你可以为每个项目生成一个,然后就可以了。

命令 which python 应该 return 没有。

安装 miniconda 和 bare python.

,这是 conda 包管理器

为每个项目创建一个环境

conda create -n myproject python=3.6

因为没有默认值 Python,您需要在您想要工作的任何时候获取环境

source activate myproject

请注意,从技术上讲,miniconda 创建了一个名为 "base" 的默认环境(无法删除)。但是像任何其他环境一样,它没有被激活,所以你仍然不会有任何 python (如果你按照建议删除),并且不会意外地 运行 "wrong" python.

这个问题好像同时问了很多不同的事情。

Is there any way to install Anaconda without any default environment

如前所述,conda 将始终有一个基础环境,这实际上是默认环境。

As such, I use Anaconda, pip, and Homebrew (I have a Mac).

如前所述,这里最大的不同是 Homebrew 用于系统范围的安装。您应该将 pipconda 视为每个项目的安装,正如我将在回答中解释的那样:

what are the best suggestions to accomplish what I want, which is to never accidentally work in an environment where it is unclear what my dependencies are, recognizing that I'm talking primarily but not exclusively about using Python?

I want to always have an equivalent to a requirements.txt or package.json file available, both to clearly separate one project from another, and so that I can easily look back to see what is installed (and what version of it).

从事数据科学工作多年,这是我确定的解决方案,可以解决您所有的问题。

  1. (On Mac)使用 Homebrew 安装所有系统级工具,但帮自己一个忙,尽量将其限制为 'generic' 工具,例如 GNU 工具(例如 wgettree) 或其他不会在每个项目基础上更改的东西 and/or 否则最好在系统范围内安装(例如 Vagrant、Docker、PostgreSQL

  2. 对于每个项目,都有一个专用的包装脚本,用于在当前目录中安装 conda。请注意,我并不是要安装全局 conda 并使用 conda 环境,我的意思是在每个项目中都安装一个新的 conda。这会很好地工作,因为在您的包装器脚本中,您将包含一组详细的、版本锁定的 conda 安装命令,这些命令是安装您需要的所有软件包的确切版本所需的。

此外,您的包装器脚本将包含将此 conda 放入您的 $PATH 所需的系统环境修改,并清除或覆盖对任何其他系统 Python 的延迟引用。 conda 能够安装相当大量的非 Python 软件包,因此这会尽可能地照顾您的非 Python 软件依赖项。这包括 R 安装和许多 R 包(对于像 Bioconductor 这样的东西,由于更好的版本控制,这种安装方式比 'vanilla' 方式更安全)。

对于必须与 pip 一起安装的软件包,请不要担心,因为每个 conda 安装都带有自己的 pip 安装。因此,您可以在 condapip install,并且软件包将单独保留在 conda 中。您的 pip install 命令也将被版本锁定,如果您愿意,可以使用 requirements.txt,保证它是可重现的。

  1. 现在您已经设置了每个项目的专用 conda 实例,您将使用上述包装器脚本将您在项目中使用的所有命令包装到 运行 您的软件.如果您需要以交互方式工作,您可以从包装脚本中调用 bash,它会带您进入一个交互式 bash 进程,您的环境来自预先填充的包装脚本。

实际上,我更喜欢使用 GNU make 和 Makefile 来完成所有这些事情。我在每个项目目录的根目录下创建一个文件 Makefile,内容如下所示:

SHELL:=/bin/bash
UNAME:=$(shell uname)

# ~~~~~ Setup Conda ~~~~~ #
PATH:=$(CURDIR)/conda/bin:$(PATH)
unexport PYTHONPATH
unexport PYTHONHOME

# install versions of conda for Mac or Linux, Python 2 or 3
ifeq ($(UNAME), Darwin)
CONDASH:=Miniconda3-4.7.12.1-MacOSX-x86_64.sh
endif    
ifeq ($(UNAME), Linux)
CONDASH:=Miniconda3-4.7.12.1-Linux-x86_64.sh
endif

CONDAURL:=https://repo.continuum.io/miniconda/$(CONDASH)
conda:
    @echo ">>> Setting up conda..."
    @wget "$(CONDAURL)" && \
    bash "$(CONDASH)" -b -p conda && \
    rm -f "$(CONDASH)"

install: conda 
    conda install -y \
    conda-forge::ncurses=6.1 \
    rabbitmq-server=3.7.16 \
    anaconda::postgresql=11.2 \
    pip install -r requirements.txt

# start interactive bash session
bash:
    bash
run:
    python myscript.py

现在,当你 cd 进入你的项目目录时,你可以 运行 像 make install 这样的命令来安装你所有的依赖项,以及 [=35= 这样的命令] 运行 您的项目代码。

  • conda 安装的提示:首先安装所有包而不指定任何版本号,然后在安装完所有包后返回并添加版本号。这比尝试预先指定它们要容易得多。

最后,如果您的软件依赖项不适合 Homebrew 或 conda 或 pip 以这种方式,您需要开始就您真正需要多少可再现性和隔离性做出一些选择。您可能会开始研究 Docker 容器或 Vagrant 虚拟机(在这两种情况下,您都可以将配方保存在项目目录中并继续将命令包装脚本到 运行 您的代码,以供将来参考) .我通常不会 运行 进入任何没有结合使用 conda、pip、Docker 或 Vagrant 的项目软件。

对于真正情有可原的情况,例如 运行在本地使用 RStudio,它不能很好地与安装在 conda 中的 R 和 libs 配合使用,我会稍微让步并强制安装全局所需的包以用于开发目的但也尝试在 conda 或 Docker 和 运行 中重新创建一个隔离的版本锁定 R + 库实例,代码作为脚本在那里验证结果仍然可以在没有全局包的情况下重新生成