Makefile无法使用`conda activate`

时间:2018-11-19 20:45:51

标签: python makefile anaconda conda

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

  

CommandNotFoundError:您的外壳尚未正确配置为   使用“ conda激活”。如果您的外壳是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的外壳,但这不能解决问题。另外,我需要此makefile才能使用计算机的默认外壳程序运行(我的一些队友使用zsh,其他人使用bash)。似乎无论我做什么,我都无法使conda activate在Makefile中工作。

我该怎么办才能使它正常工作?

4 个答案:

答案 0 :(得分:0)

conda activate设置环境变量。但是,GNU Make在新产生的外壳程序中调用配方的每一行。您需要在配方的每一行中调用conda activate

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

答案 1 :(得分:0)

经过一番搜索,我想出了将此模式添加到我的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 )

答案 2 :(得分:0)

您应该在脚本开头使用|---------------------|------------------|----------------| | INTERFACE_NAME | RULE_NAME | ERROR_COUNT | |---------------------|------------------|----------------| | EMP01 | Invalid dept | 2 | |---------------------|------------------|----------------| | EMP01 | Invalid dept | 2 | |---------------------|------------------|----------------| | EMP01 | - | 2 | |---------------------|------------------|----------------| | DEPT01 | Missing Dept id | 3 | |---------------------|------------------|----------------| | DEPT01 | Missing Dept id | 3 | |---------------------|------------------|----------------| | DEPT01 | - | 3 | |---------------------|------------------|----------------| | Total | - | 5 | |---------------------|------------------|----------------| 指令。这一切都在同一外壳中运行。

答案 3 :(得分:0)

您需要记住的重要一件事是Makefile将在单独的子外壳中执行配方的每一行,例如在一行中导出PATH不会影响下一行Makefile中的命令所看到的内容!请参阅Makefile manual - Recipe Execution

当需要执行配方来更新目标时,可以通过为配方的每一行调用一个新的子shell来执行它们,除非.ONESHELL特殊目标生效(请参阅使用一个Shell)(实际上,make可能会采用不影响结果的快捷方式。)

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