【问题标题】:Activate Anaconda Python environment from makefile从 makefile 激活 Anaconda Python 环境
【发布时间】:2016-12-17 02:44:17
【问题描述】:

我想使用 makefile 来构建我的项目环境,使用 makefile 和 anaconda/miniconda,所以我应该能够克隆 repo 并简单地运行 make myproject

myproject: build

build:
  @printf "\nBuilding Python Environment\n"
  @conda env create --quiet --force --file environment.yml
  @source /home/vagrant/miniconda/bin/activate myproject

但是,如果我尝试这样做,我会收到以下错误

制作:来源:找不到命令

make: *** [来源] 错误 127

我已寻找解决方案,但 [this question/answer(How to source a script in a Makefile?) 表明我不能在 makefile 中使用 source

然而,This answer 提出了一个解决方案(并收到了几个赞成票),但这对我也不起作用

(\
源 /home/vagrant/miniconda/bin/activate myproject; \

)

/bin/sh: 2: 来源:未找到

make: *** [来源] 错误 127

我还尝试将 source activate 步骤移至单独的 bash 脚本,并从 makefile 执行该脚本。这不起作用,我假设出于类似的原因,即我在 shell 中运行 source

我应该补充一点,如果我从终端运行source activate myproject,它可以正常工作。

【问题讨论】:

  • 阅读/home/vagrant/miniconda/bin/activate的内容。请注意,source 是内置的 shell,不是要调用的可执行文件,它在当前 shell 的上下文中执行文件的语句。由于make 运行不同的shell 副本,因此您无法在当前shell 中 从中激活virtualenv,就像您无法从makefile 更改当前shell 的目录一样。
  • 所以本质上我没有办法通过makefile来实现这一点?
  • 您可以克隆一个 repo,在 shell 中激活一个环境,然后运行一个 make 步骤(可能是另一个 makefile)在 shell 的调用中。例如。 /bin/sh -c "source path/to/activate; make me_a_sandwich"
  • @PhilipO'Brien 看看你最终选择了什么方法真的很有趣。我也面临同样的限制。

标签: python bash makefile virtualenv anaconda


【解决方案1】:

我遇到了同样的问题。基本上唯一的解决方案是 9000。我有一个设置 shell 脚本,在其中设置 conda 环境(源激活 python2),然后调用 make 命令。我尝试从 Makefile 内部设置环境,但没有成功。

我的 makefile 中有这一行:

installpy :
   ./setuppython2.sh && python setup.py install

错误信息是:

make
./setuppython2.sh && python setup.py install
running install
error: can't create or remove files in install directory

The following error occurred while trying to add or remove files in the
installation directory:

    [Errno 13] Permission denied: '/usr/lib/python2.7/site-packages/test-easy-install-29183.write-test'

基本上,我能够设置我的 conda 环境以使用我具有写入权限的本地 conda。但这并没有被制作过程拾取。我不明白为什么在我的 shell 脚本中使用 'source' 设置的环境在 make 过程中不可见; source 命令应该改变当前的 shell。我只是想分享这个,这样其他人就不会浪费时间尝试这样做。我知道 autotools 有一种使用 python 的方法。但是make程序在这方面可能是有限的。

我目前的解决方案是一个 shell 脚本:

猫 py2make.sh

#!/bin/sh

# the prefix should be change to the target
# of installation or pwd of the build system
PREFIX=/some/path
CONDA_HOME=$PREFIX/anaconda3
PATH=$CONDA_HOME/bin:$PATH
unset PYTHONPATH
export PREFIX CONDA_HOME PATH
source activate python2
make

这似乎对我很有效。

有类似情况的solution,但它似乎对我不起作用:

我修改后的 Makefile 段:

installpy :
   ( source activate python2; python setup.py install )

调用make后的错误信息:

make
( source activate python2; python setup.py install )
/bin/sh: line 0: source: activate: file not found
make: *** [installpy] Error 1

不知道我哪里错了。如果有人有更好的解决方案,请分享。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题;我想从 Makefile 创建或更新 conda 环境,以确保我自己的脚本可以使用该 conda 环境中的 python。
    默认情况下,make 使用 sh 来执行命令,而 sh 不知道 source(另见 this SO answer)。我只是将 SHELL 设置为 bash 并以(仅相关部分)结束:

    SHELL=/bin/bash
    CONDAROOT = /my/path/to/miniconda2
    .
    .
    install: sometarget
            source $(CONDAROOT)/bin/activate && conda env create -p conda -f environment.yml && source deactivate
    

    希望对你有帮助

    【讨论】:

    • 非常感谢您的提示 - 将我的 shell 设置为 Bash shell 是让 source 命令工作的诀窍!
    • 似乎还需要使用&& 才能让命令在环境中运行。
    • 真的很有帮助
    【解决方案3】:

    你应该使用它,它现在对我有用。

    report.ipynb : merged.ipynb
        ( bash -c "source ${HOME}/anaconda3/bin/activate py27; which -a python; \
            jupyter nbconvert \
            --to notebook \
            --ExecutePreprocessor.kernel_name=python2 \
            --ExecutePreprocessor.timeout=3000 \
            --execute merged.ipynb \
            --output=$< $<" )
    

    【讨论】:

      猜你喜欢
      • 2016-11-28
      • 2020-03-14
      • 2013-12-03
      • 2021-09-06
      • 1970-01-01
      • 2017-08-22
      相关资源
      最近更新 更多