きっかけ
前回記事を書いた際に生じた疑問をコメント欄で@tenmyoさんに補足してもらった(ありがとうございます!).しかし,理解ができず月日は去って2ヶ月.その間に昔作った別の古いプログラムを動かしたところ,ファイルに書き込まれないことがあったことで解決方法を理解したため新たに記事にする.
前提
今回やること
- 動作理解
1-1. なぜだめだったのか
1-2. ディレクトリ構成の比較
1-3. ディレクトリ構成の変更に伴ったソースコードの変更点 - 新たな問題点
1.動作理解
1-1.どこの理解ができていなかったのか
1-2.旧ディレクトリ構成を見てもらいたい.Users/hoge1/hoge2/hoge3/test.py
が実行するファイルである.このファイルが存在する場所から見て画像ファイル(ex. test1.jpg)が存在する場所を相対パスで指定するはずだと考えてはいたもののソースコード上ではimage_file_dict
のように指定するとうまくいっていたことが疑問だった.その旨を以前の記事で書いたところコメントが返ってきた.
@tenmyoさんの「たぶんプログラム実行の初期位置がホームディレクトリ(/Users/hoge1)なんじゃないかな。」がまさにその通りだった.crontab -e
で実行したいファイルの存在する場所を記述してもcronから起動された場合,作業ディレクトリは/Users/hoge1であるためそこから見て同じ階層にある画像ファイルにアクセスできるようだ.
以上のことを理解したが結局新たにディレクトリを作って(line_api),そこにまとめておくことにした(新ディレクトリ構成参照).それに伴ってソースコードのimage_file_dict
を作業ディレクトリ(hoge1)から見た相対パスに変え,crontab -e
で実行ファイルのパスも変えた.
1-2.ディレクトリ構成の比較
旧ディレクトリ構成
Users /
├─hoge1 /
├─test1.jpg
├─test2.jpg
├─test3.jpg
├─test4.jpg
├─test5.jpg
├─hoge2 /
├─hoge3 /
├─test.py
新ディレクトリ構成
Users /
├─hoge1 /
├─line_api /
├─test1.jpg
├─test2.jpg
├─test3.jpg
├─test4.jpg
├─test5.jpg
└─line.py
1-3.ディレクトリ構成の変更に伴ったソースコードの変更点
import requests
TOKEN = 'さっき発行したトークン'
api_url = 'https://notify-api.line.me/api/notify'
send_contents = '毎日早起きしてすごい!' # 画像だけでは送信できない.メッセージ必須.
TOKEN_dic = {'Authorization': 'Bearer' + ' ' + TOKEN}
send_dic = {'message': send_contents}
# LINE通知を送る(200: 成功時、400: リクエストが不正、401: アクセストークンが無効:公式より)
# 5枚のうち,どの画像にするかを疑似乱数で決める
choice = random.randint(1,5)
image_file_dict = {1:'line_api/test1.jpg',2:'line_api/test2.jpg',3:'line_api/test3.jpg',4:'line_api/test4.jpg',5:'line_api/test5.jpg'}
# 画像ファイルのパスを指定
image_file = image_file_dict[choice]
# バイナリデータで読み込む
binary = open(image_file, mode='rb')
# 指定の辞書型にする
image_dic = {'imageFile': binary}
# LINEに画像とメッセージを送る
requests.post(api_url, headers=TOKEN_dic, data=send_dic, files=image_dic)
前回の記事からさらに変更する場所は画像のパス.
このソースコードを前回の test.py から line.py と変更して保存した.
前回同様 Terminal を開いてcrontab -e
と入力し,Enter を押すと Vi で入力できる画面がでてくる.ここに例えば毎日6時に line.py というファイルを python3 コマンドで実行したい場合は新ディレクトリ構成を参照して次のように書く.
0 6 * * * python3 /Users/hoge1/line_api/line.py
2.新たな問題点
実は旧ディレクトリ構成における hoge3 は pyenv で作成した仮想環境だった.今回はそれをやめて新たにまとめディレクトリ(line_api)を作ったわけだが,ソースコードの1行目のimport requests
の時点で
no module named `requests`
というエラーが起きるようになってしまった.requests ライブラリはすでにインストールしてあったため何がダメなのか分からず,再びしばらく詰まっていたが解決したため,次の記事とする.結局パスの問題だった…….
参考文献
この記事は以下の情報を参考にして執筆しました。