Anacondaの仮想環境で Python を Cronで実行 するには以下の手順を踏む必要があります。
① 仮想環境のアクティベート
② Pythonコマンド で Pythonの実行
ポイントは 最初に仮想環境 を アクティベートする という点です。
なお、Xserverの 管理者権限は不要 で実行できます。
また、仮想環境の構築方法は以下の記事をご参考ください。
ではいってみましょう。
1.Cronで実行するシェルスクリプトを書く
仮想環境のアクティベート と Pythonコマンド を実行するために、シェルスクリプトを用意します。
| 1 2 3 | #!/bin/bash source /home/usr/anaconda3/bin/activate myenv python3 /home/usr/pyproject/test.py | 
コードの解説
- シェル指定 #!/bin/bashで スクリプトがbashで実行 されることを指定。
- 仮想環境の有効化 sourceコマンド で Anacondaの仮想環境myenvをアクティブ化。
- Pythonスクリプトの実行 仮想環境内でPython 3を使い、test.pyを実行。
こうすることにより 仮想環境をアクティベート した上で Python を実行できます。
2.シェルスクリプトに 実行権限 を付与する
先ほど作成したシェルスクリプト (ここでは script_name.sh という名前 にしています) に 実行権限を付与 します。
| 1 | chmod +x script_name.sh | 
3.改行コードを LF に変更する
改行コードが Windows形式 (CRLF) になっているとエラーになります。Linuxでは Unix形式 (LF) の改行コードを使用します。
VSCodeの場合、画面の右下に改行コードを設定する項目があります。変更して保存します。

4.Cron に登録する
Xserver のパネルから登録する場合
以下の画像のように コマンド に シェルスクリプトのパス を入力します。

Linuxのコマンドから登録する場合
以下のコマンドを実行します。
| 1 | crontab -e | 
表示された Cron の内容に以下を追加します。
| 1 | * * * * * /home/usr/pyproject/test.sh | 
想定されるエラー
Pythonのコードの中に 相対パス がある
Pythonのコードの中に 相対パス を書いている場合 エラーになる可能性が高いです。
たとえば、以下の Pythonコード を書いていたとします。
| 1 2 3 | # 現在のディレクトリにあるファイルを読み込む簡単なコード with open('example.txt', 'r') as file:     print(file.read()) | 

このような場合に、Cron から実行すると エラーとなります。
なぜエラーとなるのか?
Cron で実行した場合 /home/usr が基準の位置になる からです。
この場合 /home/usr/example.txt を探しに行ってしまうのです。
しかし、実際には /home/usr/pyproject/example.txt にあります。
よって以下のエラーが出るのです。
# エラー
FileNotFoundError: [Errno 2] No such file or directory: ‘example.txt’
どうすればいいか
もちろん、絶対パスで書き直す といいですが、現実的ではないと思います。
ですので、 cd をつかって、基準の位置を python ファイルの位置に変更します。
| 1 2 3 4 | #!/bin/bash source /home/usr/anaconda3/bin/activate myenv cd /home/usr/pyproject # これを追加!! python3 /home/usr/pyproject/test.py | 
実行結果

中身が読み取れている ことが分かります。
おわりに
今回は、Anaconda の仮想環境で Python を Cron で実行する方法をご紹介しました。
最後にポイントをまとめます。
- シェルスクリプトで 仮想環境を指定 (今回は myenv を指定)
- シェルスクリプトの中で cd を使って 基準の位置を変更 する
是非ご参考にしてください。
ではまた。
 
  
  
  
  


コメント