paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

python製自作ツールに引数処理を追加する

昨日Start-upという2019年の韓国映画をみたのですが、記録のために自作の映画ツイートツールを使ったところ違う公開年のタイトルが出てきてしまいました。
まあありがちなタイトルだし仕方ないよね。

昨日はコード内に公開年のリクエストを追加して投稿したのですが、どうせなら公開年の指定も出来るようにしようということで久しぶりにコードを修正しました。
リメイク版のタイトルでも同じように投稿できるようにしたいです。

公開年を引数で指定してAPIのパラメータに一緒に渡すようにします。

自作ツール:
OMDB APIを取得するツールをpythonで自作する - paloma blog

引数処理の練習

pythonにはargparseというモジュールがあるのでこれを使って簡単に作ります。
まずは練習。

--yearで引数名を指定。
渡された引数はargs.yearでアクセスできます。

引数ありなしで出力を分岐させます。

masashi@PC-ubuntu:~$ cat argtest.py 
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--year', type=int)
args = parser.parse_args()

if args.year:
    print('{}年宇宙の旅'.format(args.year))
else:
    print('2001年宇宙の旅')

実行。

masashi@PC-ubuntu:~$ python3 argtest.py 
2001年宇宙の旅
masashi@PC-ubuntu:~$ python3 argtest.py --year 2022
2022年宇宙の旅

出力変わってますね。OK。

修正点

diffだけ見せられてもナンノコッチャですが、自分のおさらいのため載せておきます。

大まかに

  • 公開年を指定するargparseの処理を追加
  • 映画のタイトル入力をsysの引数処理からargparseで拾うように変更
    • タイトルにハイフンが入っていると引数扱いで処理してしまうのでタイトル用の引数を作成
    • 「-」のみの引数も扱えるのでこれが干渉していると思われる
  • year引数の有無でAPIに渡すパラメータを分岐

を変更しました。

(movies) masashi@PC-ubuntu:~/movietweet$ git diff b84ea1 getinfo.py
diff --git a/getinfo.py b/getinfo.py
index a22db63..045d32f 100644
--- a/getinfo.py
+++ b/getinfo.py
@@ -3,15 +3,22 @@ import sys
 import json
 import configure
 import re
+import argparse
 
 KEY = configure.APIKEY
 url = 'http://www.omdbapi.com/'
-gettitle = '+'.join(sys.argv[1:])
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--title', nargs='+', help='Input movie title', required=True)
+parser.add_argument('--year',type=int, help='Specify released year')
+args = parser.parse_args()
+
+gettitle = '+'.join(args.title)
 getinfo = ''.join([url, '?apikey=', KEY, '&t=', gettitle])
 
-def main():
+def getmovieinfo(infos=getinfo):
 
-       movieinfo = requests.get(getinfo)
+       movieinfo = requests.get(infos)
        dataload = json.loads(movieinfo.text)
 
        datadump = json.dumps(dataload, indent=0)
@@ -21,5 +28,13 @@ def main():
 
        print(shapedata)
 
+def main():
+
+       if args.year:
+               getinfo_y = ''.join([url, '?apikey=', KEY, '&t=', gettitle, '&y={}'.format(args.year)])
+               getmovieinfo(getinfo_y)
+       else:
+               getmovieinfo()
+
 if __name__ == '__main__':
        main()

動かしてみる

修正した情報取得スクリプトを動かしてみます。

引数なし
(movies) masashi@PC-ubuntu:~/movietweet$ python getinfo.py --title start-up | grep -E '(Year|Title|Actor)'
Title: Start-Up
Year: 2020\u2013
Actors: Bae Suzy, Nam Joo-hyuk, Kim Seon-Ho
引数あり
(movies) masashi@PC-ubuntu:~/movietweet$ python getinfo.py --title start-up --year 2019 | grep -E '(Year|Title|Actor)'
Title: Start-Up
Year: 2019
Actors: Ma Dong-seok, Jeong Min Park, Jung Hae-In

OKですね。
同じタイトルですが公開年と役者が違うものが出力されました。

本処理

理由は忘れてしまいましたがメインの処理は成形含めシェルスクリプトで呼び出すようにしているので実行します。

引数なし
(movies) masashi@PC-ubuntu:~/movietweet$ bash twmovieinfo.sh start-up
2022-05-05に「Start-Up」を視聴しました。

Infomation
---
Year: 2020\u2013
Genre: Comedy, Drama, Romance
Director: N/A
Actors: Bae Suzy, Nam Joo-hyuk, Kim Seon-Ho
---

投稿しますか?: [y/n]n
スクリプトを終了します。
引数あり
(movies) masashi@PC-ubuntu:~/movietweet$ bash twmovieinfo.sh start-up --year 2019
2022-05-05に「Start-Up」を視聴しました。

Infomation
---
Year: 2019
Genre: Action, Comedy, Drama
Director: Jeong-Yeol Choi
Actors: Ma Dong-seok, Jeong Min Park, Jung Hae-In
Production: N/A
---

投稿しますか?: [y/n]n
スクリプトを終了します。

OK!
引数ありの内容は昨日の投稿と同じです。

まとめ

pythonの引数処理の追加を行いました。
引数処理は自分で作ると大変ですが、便利なモジュールがあり助かります。

本ツールはbash-snipetsのmoviesコマンドを参考に作成しましたが、公開年指定はオリジナルにも無いのでいい感じに機能追加できたと思います。
(オリジナル版を修正、プルリクしても良かったのですが)
いろいろ動かなくて四苦八苦でしたがうまいこと収まってよかったです。

最近積んであったモンハンワールドばかり遊んでいて、久しぶりにpython書きました。
簡単な修正に見えるかもしれませんが、こんなんでも自作のものが動くと楽しいです。

リポジトリ

github.com