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

Mik*_*son 8 python homebrew pip package-managers anaconda

背景

我想避免在默认环境中"意外"工作.

我希望总是有一个等效的文件requirements.txtpackage.json文件,既可以清楚地将一个项目与另一个项目分开,也可以让我轻松回顾一下安装的内容(以及它的版本).


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

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


让我的目标更低,更现实,我只想确保尽可能没有默认环境,使其更清洁,更容易与他人合作.

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

有没有办法在没有任何默认环境的情况下安装Anaconda ,这样我将永远不得不这样做source activate <my_env>?如果是这样,我该怎么做?

除此之外,有什么最好的建议可以实现我想要的,哪些是在我不清楚我的依赖关系是什么的环境中从不会意外地工作,认识到我主要谈论但不仅仅是关于使用Python?

(请不要建议我在安装包装时"要小心".是的,我理解.但是我试图先做出选择,尽可能做出错误或不可能的错误选择.如果我有的话例如,没有默认环境,pip直到我采购环境才会工作,因为在我的正常环境中找不到它.)

use*_*531 1

这个问题似乎同时问了很多不同的事情。

有没有办法在没有任何默认环境的情况下安装Anaconda

如前所述,conda始终会有一个基本环境,这本质上是默认环境。

因此,我使用 Anaconda、pip 和 Homebrew(我有一台 Mac)。

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

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

我希望始终有一个与requirements.txt或package.json文件等效的可用文件,既可以将一个项目与另一个项目清楚地分开,又可以轻松地回头查看安装的内容(以及它的版本)。

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

  1. (在 Mac 上)使用 Homebrew 安装所有系统级工具,但帮自己一个忙,尝试将其限制为“通用”工具,例如 GNU 工具(例如wgettree)或其他不会在每个项目上更改的东西基础和/或以其他方式在系统范围内更好地安装(例如 Vagrant、Docker、PostgreSQL

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

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

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

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

在实践中,我更喜欢使用make带有 Makefile 的 GNU 来完成所有这些事情。我在每个项目目录的根目录下创建一个文件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
Run Code Online (Sandbox Code Playgroud)

现在,当您cd进入项目目录时,您只需运行一个命令(例如make install安装所有依赖项)和一个命令(例如make run运行项目的代码)。

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

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

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