web-dev-qa-db-ja.com

Python-シェルスクリプトからconda envをアクティブ化

いくつかの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'.
17
user9074332

エラーメッセージはかなり役立ちます。スクリプトが実行されているサブシェル内から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を使用できるようにするのに十分なはずです。

9
Niayesh Isky

私は「ソースコマンド」を使用してシェルスクリプトを実行します。

source Shell_script.sh
9
qidong

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.6リリースログからの引用

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がこのサブシェルで初期化されていないことです。

参考文献

5
Simba

conda activateまたはsource activateinシェルスクリプトを使用すると、常に機能するわけではなく、このようなエラーがスローされる可能性があります。スクリプト内の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はシェルスクリプトではまだ機能しません。

1
Lamma

シェルで次のようなことを単に行うことの問題は何ですか?

ソース/opt/conda/etc/profile.d/conda.sh

(conda initはまだ実験的としてマークされているため、まだ使用するのが良いかどうかはわかりません)。

0
HAltos