my_env という既存の Anaconda Python 環境を使用して、cron ジョブで Python スクリプトを実行したいと考えています。考えられる唯一の方法は、cron ジョブで というスクリプトを実行し、それmy_script.bash
によって env がアクティブ化されてから Python スクリプトが実行されるというものです。
#!/bin/bash
source activate my_env
python ~/my_project/main.py
コマンドラインからこのスクリプトを実行しようとしても機能しません。
$ sh scripts/my_script.bash
scripts/my_script.bash: 9: scripts/my_script.bash: source: not found
適切な環境がアクティブ化されていることを確認するには、何をする必要がありますか。 まるで私が 5 歳児であるかのように説明しても大丈夫です。
ベストアンサー1
かなりいじった後、crontab
conda 環境をアクティブ化しconda activate my_env
、その環境内で Python インタープリターを実行することができました。
注: 私は Ubuntu 18.04 を使用しています。
背景
Anaconda インストーラーが conda を初期化すると、ファイルの末尾にスニペットが追加されます
~/.bashrc
。このファイルは、ユーザーが対話的に開くたびに実行されます。このスニペットにより、ユーザーはからコマンド (つまり)bash
を実行できます。conda
conda activate my_env
bash
Anacondaインストーラv2020.02には以下が追加されました
conda
スニペット~/.bashrc
:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
. "/opt/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/opt/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
/opt/anaconda3/
正しい参照に置き換えられるパス: 通常は/home/USERNAME/anaconda3/
.
問題
ソース入力~/.bashrc
はcrontab -e
機能しません (少なくとも Ubuntu では)。
説明:
- Ubuntu では、
~/.bashrc
ファイルの先頭に次の行 (または同様の行) があります。
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
~/.bashrc
これは、 のファイルをソースしようとすると、が対話的に実行されていないため、ファイルcrontab
の残りの部分は.bashrc
実行されないことを意味します(別のcrontab
このトピックに投稿する)。つまり、上記のスニペットは、 をソースしてもconda
決して実行されません。crontab
~/.bashrc
_________ 実用的なソリューション _________
私が見つけた解決策は、conda
スニペットを別のファイルにコピーすることです。
1.conda
からスニペット~/.bashrc
をコピーする~/.bashrc_conda
上記のスニペットを別のファイルにコピーします (例: ) ~/.bashrc_conda
。
確認しておいて:
- cronjob を実行しているユーザーには、このファイルを読み取る権限があります。
- 他のユーザーはこのファイルに書き込むことができません (セキュリティ上のリスク)。
2.の代わりにcrontab -e
実行するための2行を挿入し、ソースにbash
sh
~/.bashrc_conda
実行しcrontab -e
て次の2行を追加しますcronジョブの前:
SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
説明:
SHELL=/bin/bash
は、(デフォルト)の代わりに をcrontab
介して cron ジョブを実行することを意味します。bash
sh
投稿を見る。BASH_ENV=~/.bashrc_conda
実行するconda
スニペットのソース。bash
chrontab
役職そして役職。
3.希望するスクリプト実行の前にcrontab -e
cronjob行を挿入します。conda activate my_env;
.py
目的の conda 環境内で毎日正午 12:30 に実行されるスクリプトのエントリの例:
30 12 * * * conda activate my_env; python /path/to/script.py
conda activate my_env;
Python インタープリターを実行するコマンドの前に注意してください。
_______________
そしてほら、 出来た。
欠点はありますか?conda
スニペットがアップデート.bashrc
によって更新された場合conda
、もちろん別のファイルには反映されません.bashrc_conda
。時々アップデートを確認する必要があるかもしれません。
また; conda deactivate
、終わりその cronjob ですが、これは冗長かもしれません。