いくつかのconda環境での管理を容易にするために、簡単なシェルスクリプトを実行したいと思っています。 linux
osのconda activate
を介してconda環境をアクティブ化することは、シェルでは問題なく機能しますが、シェルスクリプト内では問題があります。なぜこれが起こっているのかについて誰かが私を正しい方向に向けることができますか?
問題を繰り返す例:
# default conda env
$ conda info|egrep "conda version|active environment"
active environment : base
conda version : 4.6.9
# activate new env to prove that it works
$ conda activate scratch
$ conda info|egrep "conda version|active environment"
active environment : scratch
conda version : 4.6.9
# revert back to my original conda env
$ conda activate base
$ cat Shell_script.sh
#!/bin/bash
conda activate scratch
# run Shell script - this will produce an error even though it succeeded above
$ ./Shell_script.sh
CommandNotFoundError: Your Shell has not been properly configured to use 'conda activate'.
To initialize your Shell, run
$ conda init <Shell_NAME>
Currently supported shells are:
- bash
- fish
- tcsh
- xonsh
- zsh
- powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your Shell after running 'conda init'.
エラーメッセージはかなり役立ちます。スクリプトが実行されているサブシェル内からcondaが正しく設定されていないことを示しています。スクリプト内でcondaを使用できるようにするには、(エラーメッセージにあるように)実行する必要があります。最初にconda init bash
(またはシェルが何であれ)。 condaの動作と設定方法はcondaのバージョンによって異なりますが、バージョン4.4以降の動作の理由は、conda
がcondaシェル自体によって通常設定される特定の環境変数に依存しているためです。最も重要なのは、 この変更ログのエントリ が、conda activate
およびdeactivate
コマンドがバージョン4.4以降で期待どおりに動作しない理由を説明しています。
この詳細については、GitHubの 公式のcondaの問題 を参照してください。
編集:いくつかのさらなる調査によると、エラーメッセージに記載されているconda init
関数は実際には新しいv4.6.0機能であり、迅速な環境設定により、古いconda activate
の代わりにsource activate
を使用できます。ただし、これが機能する理由は、現在のシェルのいくつかの環境変数を追加/変更し、RCファイルにも変更を加えるためです(例:.bashrc
)。RCファイルの変更が現在のシェルで取得されることはなく、新たに作成されたシェル。 (もちろん、.bashrcを再度ソースする場合を除きます)。実際、conda init --help
は次のように述べています。
重要:
conda init
の実行後、変更を有効にするには、ほとんどのシェルを閉じて再起動する必要があります
ただし、conda init
をインタラクティブに使用できることができるため、conda activate
はすでに実行済みです。実際、.bashrcを開くと、シェルにcondaコマンドを探す場所を教えるcondaによって追加された数行が表示されるはずです。ただし、スクリプトの問題は、.bashrcがnotであり、シェルスクリプトを実行するサブシェル( この答え 詳細については)。つまり、非ログインインタラクティブシェルはcondaコマンドを認識しますが、conda init
を何度呼び出しても、非インタラクティブスクリプトサブシェルは認識しません。
これは、スクリプトを次のように実行することによって推測されます(私はLinuxにはcondaがないので、テストできません)。
bash -i Shell_script.sh
conda activate
が正しく動作するはずです。どうして? -i
は、インタラクティブモードで実行を開始することをシェルに通知するbashフラグです。つまり、.bashrcを自動的に取得します。これは、スクリプトを通常どおり使用しているかのようにスクリプト内でcondaを使用できるようにするのに十分なはずです。
私は「ソースコマンド」を使用してシェルスクリプトを実行します。
source Shell_script.sh
bash
のクイックソリューション:prepend次の初期化スクリプトをBashスクリプトに挿入します。
eval "$(command conda 'Shell.bash' 'hook' 2> /dev/null)"
できました。
他のシェルの場合は、シェルのinit confを確認し、Shell conf内の次のコンテンツをコピーして、スクリプトに追加します。
# >>> conda initialize >>>
...
# <<< conda initialize <<<
あなたも使うことができます
conda init --all --dry-run --verbose
スクリプトで必要なinitスクリプトを取得します。
これは、conda
4.6でのconda init
の導入に関連しています。
Conda 4.4は「conda activate envname」を許可しました。問題は、この新しい機能を使用するようにシェルを設定することが必ずしも簡単ではないことでした。 Conda 4.6は、広範な初期化サポートを追加して、これまでより多くのシェルが新しい「conda activate」コマンドを使用できるようにします。詳細については、「conda init –help」の出力をご覧ください。
conda
4.6でconda init
が導入された後、condaはコマンドconda
のみをPATH
に公開しますが、「base」からのすべてのバイナリは公開しません。また、環境切り替えは、すべてのプラットフォームでconda activate env-name
およびconda deactivate
によって統合されます。
ただし、これらの新しいコマンドを機能させるには、conda init
を使用して追加の初期化を行う必要があります。
問題は、スクリプトファイルがサブシェルで実行されており、conda
がこのサブシェルで初期化されていないことです。
conda activate
またはsource activate
inシェルスクリプトを使用すると、常に機能するわけではなく、このようなエラーがスローされる可能性があります。スクリプト内のsource ~/miniconda3/etc/profile.d/conda.sh
コマンドをconda activate
コマンドの上に配置する簡単な回避策:
source ~/miniconda3/etc/profile.d/conda.sh
conda activate some-conda-environment
これは私にとってうまくいった解決策であり、スクリプトを共有する場合にも機能します。これはまた、システムで作業した一部のクラスターでconda init
を使用する必要があることを回避しますが、conda activate
はシェルスクリプトではまだ機能しません。
シェルで次のようなことを単に行うことの問題は何ですか?
ソース/opt/conda/etc/profile.d/conda.sh
(conda initはまだ実験的としてマークされているため、まだ使用するのが良いかどうかはわかりません)。