【Python】argparseモジュールとやらでコマンドラインインターフェースを作成するために

プログラミング初心者の勉強ブログ #94

PyQ(https://pyq.jp/)によるPython学習記録です。Rubyを多少かじり、第二外国語としてPythonを少しづつ学んでいきます。(内容はRubyとの比較が多くなるかもしれません。)

今回はPyQの「実務でのPython」というクエストをやってる途中で出てきたargparseモジュールについてまとめます。今回かなり日記。

 

目次

[toc]

 

argparseモジュールとは

argparseモジュールはユーザーフレンドリなコマンドラインインターフェースの作成を簡単にします。プログラムがどんな引数を必要としているのかを定義すると、argparseがsys.argvからそのオプションを解析する方法を見つけ出します。argparseモジュールは自動的にヘルプと使用方法メッセージを生成し、ユーザーが不正な引数をプログラムに指定したときにエラーを発生させます。

argparse — コマンドラインオプション、引数、サブコマンドのパーサー Python 3.7.2 ドキュメント

argparseとは、コマンドラインでインターフェースを作成するためのモジュールであり、

$ python passgen.py --help
usage: passgen.py [-h] [-c] length

positional arguments:
  length         生成するパスワード長

optional arguments:
  -h, --help     show this help message and exit
  -c, --complex  文字数字だけでなく記号も含める場合指定

$ python passgen.py 16
# --> sfl25tg40fQYCL0Z

$ python3 passgen.py 8 --complex
# --> %Kiuk(BG

ターミナルで「$ python passgen.py –help」 を打ち込むとコマンドライン上で上のような使い方や使えるオプションなどを表示してくれる。何かとよく見かけるのでイメージはすぐつくが、これを自分で作成するために使うモジュールとのこと。

コードで言えば、

passgen.py

import argparse
import random
import string


def password_generator(length, complex_password=False):
    """ パスワードを生成してくれる便利な関数
    length: パスワード長
    complex_password: 記号を含む場合True、Falseであれば文字列と、数字。
    """
    if complex_password:
        candidates = string.ascii_letters + string.digits + string.punctuation
    else:
        candidates = string.ascii_letters + string.digits
    return ''.join(random.choice(candidates) for _ in range(length))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='パスワードを生成するスクリプト')
    parser.add_argument('length', type=int, help='生成するパスワード長')
    parser.add_argument('-c', '--complex', action='store_true',
                        help='文字数字だけでなく記号も含める場合指定')
    args = parser.parse_args()
    print(password_generator(args.length, args.complex))

こういった感じとなる。

フレームワークでのアプリ開発だとコマンドラインインターフェースは作る必要がないので、Webアプリ開発の勉強ばかりしてた身としてはこういうプログラムは新鮮な感じがする。gemとかそーいうプログラムを作成する練習をしないとコマンドラインインターフェースは覚えないんじゃないかなと。プログラマーといっても幅が広いと今更だが感じる。

とにかくargparseを使う場合は、

import argparse

インポートして、

parser = argparse.ArgumentParser(description='パスワードを生成するスクリプト')

「parser」を生成して、

parser.add_argument('length', type=int, help='生成するパスワード長')
parser.add_argument('-c', '--complex', action='store_true',
                    help='文字数字だけでなく記号も含める場合指定')

「add_argument()」で引数(オプション)を作り、

args = parser.parse_args()

「parse_args()」でオブジェクトにする。名前が全部似ていて少しづつ違うので覚えづらい。

あとは「args」で引数取り出せて処理が行える。argparseのサブコマンド機能もやったが、そっちは理解が曖昧なので説明できない。もう少し解説が欲しい気がする。

 

まとめ

PyQやってて「実務でのPython」という章が急に難易度上がった気がする。写経回が多くアウトプットチャンスが無いままいきなり難易度高めな問題がやってきて難しかった。次あたりDjangoに入るから割と楽しみ。フレームワーク最強。

以上ありがとうございました。

 

 

 

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA