Makefile 不能使用"conda activate"



我需要在我的makefile中激活一个conda环境来运行一些python脚本,然而,每当我尝试运行conda activate env_name时,我都会收到以下消息:

CommandNotFoundError:您的shell未正确配置为使用"conda-activate"。如果你的外壳是Bash或Bourne变体,使用为当前用户启用conda

$ echo ". /Users/MY_USERNAME/anaconda3/etc/profile.d/conda.sh" >> ~/.bash_profile

或者,对于所有用户,使用启用conda

$ sudo ln -s /Users/MY_USERNAME/anaconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh

上面的选项将永久启用"conda"命令,但是他们不会将conda的基本(根(环境放在PATH上。为此,运行

$ conda activate

在您的终端中,或者将基本环境永久地置于PATH上,运行

$ echo "conda activate" >> ~/.bash_profile

在conda 4.4之前,建议激活conda的方法是修改~/.bash_profile文件中的PATH。您应该手动删除看起来像的线路

export PATH="/Users/MY_USERNAME/anaconda3/bin:$PATH"

^^^上面的行不应该再出现在~/.bash_profile文件中!^^^

我尝试通过在顶部添加SHELL := /bin/zsh来更改makefile的shell,但这并不能解决问题。此外,我需要这个makefile能够使用计算机的默认shell运行(我的一些队友使用zsh,其他人使用bash(。似乎无论我做什么,我都无法让conda activate在makefile中工作。

我该怎么做才能让它发挥作用,还是这是不可能的?

经过一番搜索,我想到了将此模式添加到我的Makefile中,以使conda activate工作。其他人可能会简化。

# Need to specify bash in order for conda activate to work.
SHELL=/bin/bash
# Note that the extra activate is needed to ensure that the activate floats env to the front of PATH
CONDA_ACTIVATE=source $$(conda info --base)/etc/profile.d/conda.sh ; conda activate ; conda activate
py3build:
($(CONDA_ACTIVATE) py3.6 ; python setup.py build )

您应该在脚本的开头使用.ONESHELL:指令。这一切都在同一个shell中运行。

@Traveler的精彩解决方案。但请记住@Felipe Maza&Tomasz Bartkowiak,在配方之前添加.ONESHELL:解决了所有错误。

我使用的Linux系统以zsh为外壳,当前最新的conda版本:4.12.0

因此,配方将是:

.ONESHELL:
SHELL = /bin/zsh
CONDA_ACTIVATE = source $$(conda info --base)/etc/profile.d/conda.sh ; conda activate ; conda activate
# Create conda env from env.yml and compile and install exact pip packages
conda-pip:
conda env update --prune -f env.yml
$(CONDA_ACTIVATE) <<env_name>>
pip-compile requirements/req.in
pip-sync requirements/req.txt

conda-pip执行以下操作:

  1. 基于预先创建的env.yml创建conda环境
  2. 通过将<<env_name>>替换为在env.yml中设置的环境名称来激活conda环境
  3. 使用pip-compilepip-sync编译精确的pip包并将其安装到conda环境中

注意:您仍然需要激活conda环境才能在终端中使用它,因为conda-pip在一个单独的子shell中开始和结束。

您可以在此处查看有关pip-compilepip-sync的更多信息:pip-tools

您需要记住的一件重要事情是,Makefile将在单独的子shell中执行配方的每一行,因此例如,在一行中导出PATH不会影响下一行Makefile中的命令所能看到的内容!请参阅Makefile手册-配方执行:

当需要执行配方来更新目标时,除非.ONESHELL特殊目标生效(请参阅使用一个外壳(,否则会通过为配方的每一行调用一个新的子外壳来执行这些配方。(在实践中,make可能会走不影响结果的快捷方式。(

请注意:这意味着设置shell变量和调用shell命令(如cd((为每个进程设置本地上下文(不会影响配方中的以下行

这也是bash中的最小工作解决方案。我在Ubuntu中测试过这个。

请注意,.ONESHELL:的使用实际上是强制性的。如果忽略该标志,shell中的每个命令都将在单独的shell中执行。在这种情况下,您需要用分号附加所有脚本,以生成一个大的单行命令!

.ONESHELL:
SHELL = /bin/bash
CONDA_ACTIVATE = source $$(conda info --base)/etc/profile.d/conda.sh ; conda activate ; conda activate
train:
$(CONDA_ACTIVATE) <<put_your_env_name_here>>
# other stuff

conda activate等设置环境变量。然而,GNU Make调用新生成的shell中的每一行配方。您需要在配方的每一行中调用conda activate

一个更好的方法是让makefile执行conda activate,然后在新激活的环境中重新运行自己,然后构建目标。

最新更新