web-dev-qa-db-ja.com

Makefileは `conda activate`を使用できません

pythonスクリプトを実行するために、メイクファイルでconda環境をアクティブにする必要がありますが、conda activate env_nameを実行しようとすると、次のメッセージが表示されます。

CommandNotFoundError:シェルが「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'コマンドを永続的に有効にしますが、PATHにcondaのベース(ルート)環境を配置しません。そのためには、

$ 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を追加して、メイクファイルのシェルを変更しようとしましたが、これで問題が解決しません。さらに、コンピューター用のデフォルトのシェルを使用して実行できるようにするには、このメイクファイルが必要です(チームメイトの一部はzshを使用し、他のメンバーはbashを使用します)。私が何をしても、メイクファイルでconda activateを動作させることができないようです。

それを機能させるために私は何ができますか、これは不可能ですか?

11
matt_js

少し調べた後、このパターンを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 )
8
Traveler

スクリプトの先頭で.ONESHELL:ディレクティブを使用する必要があります。これはすべて同じシェルで実行されます。

1
Felipe Maza

覚えておく必要がある重要なことの1つは、Makefileがレシピの各行を個別のサブシェルで実行することです。 PATHを1行でエクスポートしても、次のMakefile行のコマンドが表示できる内容には影響しません。 Makefileマニュアルを参照してください-レシピ実行

レシピを実行してターゲットを更新するときは、.ONESHELL特別なターゲットが有効になっていない限り、レシピの各行の新しいサブシェルを呼び出すことによって実行されます(参照1つのシェルを使用する)(実際には、makeは結果に影響を与えないショートカットを使用する場合があります。)

注意:これは、シェル変数を設定し、各プロセスにローカルコンテキストを設定するcdなどのシェルコマンドを呼び出しても、レシピの次の行には影響しないことを意味します

0

conda activateは、特に環境変数を設定します。ただし、GNU Makeは新しく生成されたシェルでレシピの各行を呼び出します。レシピの各行でconda activateを呼び出す必要があります。

より良い方法は、makefileがconda activateを実行してから、新しくアクティブ化された環境で自分自身を再実行して、ターゲットをビルドすることです。

0