回答问题

背景

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

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


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

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


把我的目光放得更低更现实,我只是想确保尽可能没有默认环境,以使与他人合作的项目更清洁、更容易。

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

问题

有没有什么方法可以安装 Anaconda 没有任何默认环境,这样我就永远需要source activate <my_env>?如果是这样,我该怎么做?

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

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

Answers

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

有没有什么方法可以在没有任何默认环境的情况下安装 Anaconda

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

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

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

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

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

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

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

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

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

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

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

在实践中,我更喜欢使用带有 Makefile 的 GNUmake来完成所有这些事情。我在每个项目目录的根目录下创建了一个文件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的命令来安装所有依赖项,并运行类似make run的命令来运行项目的代码。

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

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

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

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐