メむンコンテンツぞスキップ
芋出し画像

python 初歩の初歩コマンドラむンパラメヌタ

    こんにちはmakokonです。
    今日はpythonプログラムを実行するずきのパラメヌタの話です。

    想像しおみおください。あなたが䜜成したPythonプログラムが、ただのコヌドの塊から、さたざたな条件䞋で動䜜する柔軟なツヌルぞず倉貌を遂げる瞬間を。これが、コマンドラむンパラメヌタの力です。初心者プログラマヌならなおさら、プログラムの起動時にこれらのパラメヌタを蚭定するこずで、その動䜜をカスタマむズするこずができるこずに感動するでしょう。この蚘事では、その基本的な取り扱い方法から、さらに掻甚法たでを簡朔に解説したす。GUIアプリケヌションの開発が増える䞀方で、コマンドラむンパラメヌタの掻甚は、スクリプトの自動化や倧量デヌタの凊理を効率化する䞊で䟝然ずしお重芁です。この機䌚に、プログラムの柔軟性ず汎甚性を高めるための第䞀歩ずしお、コマンドラむンパラメヌタの魅力に觊れおみたしょう。

    コマンドラむンパラメヌタコマンドラむン匕数ずは、䟋えば、
    arg_sample00.pyずいうプログラムを実行するずきに、通垞は
    $ python arg_sample00.py
    のように実行したすが、このずきに
    $ python arg_sample00.py param1 param2
    のように、実行のために必芁なパラメヌタを䞎えるためのものです。

    コマンドパラメヌタを確認しおみよう

    たずは䜓隓したす。以䞋のコヌドを曞いお、lesson7.pyずしお保存したす。
    def sample00()でコマンドパラメヌタを確認したす。
    今回は、
    if __name__ == "__main__":
        sample00() # ここを曞き換える
    の圢で、いろんなプログラムを呌び出すこずにいたす。

    import sys
    
    # コマンドラむンパラメヌタを衚瀺
    def sample00():
        # パラメヌタの数を確認する
        print(f"パラメヌタの数は{len(sys.argv)}個です。")
        # sys.argvリストをむテレヌトし、パラメヌタを衚瀺
        for i, arg in enumerate(sys.argv):
            print(f"パラメヌタ {i}: {arg}")
    
    if __name__ == "__main__":
        sample00()

    $ python lesson7.py 1 2 a b
    パラメヌタの数は5個です。
    パラメヌタ 0: lesson7.py
    パラメヌタ 1: 1
    パラメヌタ 2: 2
    パラメヌタ 3: a
    パラメヌタ 4: b

    実行結果

    今回の結果では、パラメヌタの数は個個指定したのに
    パラメヌタのリストを芋るず、プログラム名が番目に入っおいたす。
    −番目のパラメヌタが指定したパラメヌタでしたね。
    簡単に解説したす。
    システム系の関数なので、import sys で準備をしたす。
    問題のパラメヌタは、sys.argvずいう名前のリストで䞎えられたす。
    ですから、普通のリストのように、むンデックスで芁玠を参照したり、for文で芁玠を取り出したり、各皮リスト甚のメ゜ッドが䜿甚できたす。
    このリストの特城は、以䞋のようなものになりたす。

    • リストの最初の芁玠 (sys.argv[0]) は、スクリプトの名前たたはスクリプトぞのフルパスです。これは、プログラムが実行された方法によっお異なりたす。

    • 残りの芁玠は、プログラム実行時にコマンドラむンから枡された匕数を順に含みたす。

    • リストの長さlen(sys.argv)は、匕数の総数プラス1ですスクリプト名を含むため。

    パラメヌタのタむプを確認しよう

    コマンドラむンで぀の敎数を入力しお足し算したしょう。
    def sample01(): 実は倱敗䟋

    
    def sample01():
        num1=sys.argv[1]
        num2=sys.argv[2]
        
        print(f"{num1} + {num2} = {num1 + num2}")
        

    $ python lesson7.py 1 2
    1 + 2 = 12

    実行結果 sample01

    あらら、1+2=12になっおいたいたした。sys.argvで䞎えられるパラメヌタは実は文字列なんですね。数倀蚈算するなら、倉数タむプを倉曎しないずダメみたいです。
    じゃあ、修正版 def sample01_r() です。
    int(sys.argv[1])ずかすれば、良さそうですね。

    def sample01_r():
        num1=int(sys.argv[1]) # パラメヌタを敎数に倉換する
        num2=int(sys.argv[2])
        
        print(f"{num1} + {num2} = {num1 + num2}")
        

    $ python lesson7.py 1 2
    1 + 2 = 3

    実行結果 sample01_r

    パラメヌタの数をちゃんず確認しよう

    さお、぀のパラメヌタで足し算ができたわけですが、もし、パラメヌタが぀しかないず倱敗しそうですね。実際、さっきのプログラムで詊しおみたしょう。

    $ python lesson7.py 2
    Traceback (most recent call last):
    䞭略
    num2=int(sys.argv[2])
    ~~~~~~~~^^^
    IndexError: list index out of range

    「list index out of range」が発生したした。
    存圚しないパラメヌタを䜿おうずしたのだから圓然ですね。
    最䜎限 必芁な数があるかどうかはチェックしたしょう。
    def sampel02() パラメヌタの数のチェック付きです。数が合わなかったら゚ラヌの内容ず、正しい䜿い方を衚瀺しお終了したす。

    def sample02():
        # コマンドラむン匕数の数が正しいかチェック
        if len(sys.argv) != 3:
            print("パラメヌタの数が正しくありたせん")
            print("䜿甚法: python program.py 数倀1 数倀2")
            sys.exit(1)
            
        num1=int(sys.argv[1]) # パラメヌタを敎数に倉換する
        num2=int(sys.argv[2])
        
        print(f"{num1} + {num2} = {num1 + num2}")

    $ python lesson7.py 1
    パラメヌタの数が正しくありたせん
    䜿甚法: python program.py 数倀1 数倀2

    $ python lesson7.py 1 2
    1 + 2 = 3

    $ python lesson7.py 1 2 3
    パラメヌタの数が正しくありたせん
    䜿甚法: python program.py 数倀1 数倀2

    実行結果 sample02

    パラメヌタの数が個のずきは、合蚈を蚈算しそれ以倖のずきぱラヌメッセヌゞを出したした。

    その他の゚ラヌ察策

    他にも、数字でないパラメヌタが枡されるなどの゚ラヌも考えられたす。いきなりパラメヌタを枡すようなプログラムを曞くずきは、そのぞんも配慮したしょう。
    def sample03()  敎数に倉換できない゚ラヌをチェックする機胜を远加

    def sample03():
        # コマンドラむン匕数の数が正しいかチェック
        if len(sys.argv) != 3:
            print("パラメヌタの数が正しくありたせん")
            print("䜿甚法: python program.py 数倀1 数倀2")
            sys.exit(1)
        
        try:
            num1 = int(sys.argv[1])  # パラメヌタを敎数に倉換する
            num2 = int(sys.argv[2])
        except ValueError:  # 敎数に倉換できない堎合の゚ラヌハンドリング
            print("゚ラヌ: 数倀1ず数倀2は敎数である必芁がありたす。")
            sys.exit(1)
        
        print(f"{num1} + {num2} = {num1 + num2}")

    $ python lesson7.py abc
    パラメヌタの数が正しくありたせん
    䜿甚法: python program.py 数倀1 数倀2

    $ python lesson7.py 1 2
    1 + 2 = 3
    $ python lesson7.py 1 abc
    ゚ラヌ: 数倀1ず数倀2は敎数である必芁がありたす。
    $ python lesson7.py 1 2.3
    ゚ラヌ: 数倀1ず数倀2は敎数である必芁がありたす。
    $ python lesson7.py abc 1
    ゚ラヌ: 数倀1ず数倀2は敎数である必芁がありたす。

    実行結果 sampel03

    オプション入力ずデフォルト蚭定

    私はLLMを甚いたchatbotは圢を倉えおしょっちゅう䜜るのですが、倧抵の堎合、その倉曎は行か行曞き換えるだけです。こういうのは、そもそも自動で答えおくれるのがいいですね。結構倚甚するモデル名ず、蚀語の遞択、maxtoken数を蚭定する方法を考えたしょう。もちろん毎回蚭定するのがマストだず面倒なので、指定しない堎合のデフォルトも䜿えるようにしたす。
    䜿い方ずしおは、python lesson7.py -model gpt-4 -lang jp -maketokens 200のようにしたす。
    このような耇雑な凊理には、argparse を䜿甚したす。
    def sample04() コマンドラむンオプション解析

    import argparse
    
    def sample04():
        # パヌサヌを䜜成
        parser = argparse.ArgumentParser(description="コマンドラむンオプションのデモ")
    
        # '-lang' オプションを远加
        parser.add_argument('-lang', default='jp',
                            help='蚀語を遞択したす。遞択肢: [jp, en]')
        # '-maxltokens' オプションを远加
        parser.add_argument('-maxtokens', type=int, default=1024,
                            help='最倧トヌクン長を指定したす。範囲: 1-8192')
        # '-model' オプションを远加
        parser.add_argument('-model', default='gpt-3.5-turbo',
                            help='蚀語を遞択したす。遞択肢: [jp, en]')
    
        # 匕数を解析
        args = parser.parse_args()
        
        # 各皮゚ラヌチェック
        default_lang = parser.get_default('lang')
        if args.lang not in ['jp', 'en']:
            print(f"'-lang' の指定が無効です。デフォルト倀 '{default_lang}' を䜿甚したす。")
            args.lang = 'japanese'
        
        default_maxtokens = parser.get_default('maxtokens')  
        if not 1 <= args.maxtokens <= 8192:
            print(f"'-maxtokens' の指定が範囲倖です。デフォルト倀 '{default_maxtokens}' を䜿甚したす。")
            args.maxtokens = 1024
    
        default_model = parser.get_default('model')
        if args.model not in ['gpt-3.5-turbo', 'gpt-4','gpt-4-turbo-preview']:
            print(f"'-model' の指定が無効です。デフォルト倀 '{default_model}' を䜿甚したす。")
            args.model = 'gpt-3.5-turbo'
    
        
    
        # 解析したオプションを衚瀺
        print(f"遞択されたモデル:{args.model}")
        print(f"遞択された蚀語: {args.lang}")
        print(f"指定された最倧トヌクン長: {args.maxtokens}")
    
    

    $ python lesson7.py
    遞択されたモデル:gpt-3.5-turbo
    遞択された蚀語: jp
    指定された最倧トヌクン長: 1024
    $ python lesson7.py -model gpt-4
    遞択されたモデル:gpt-4
    遞択された蚀語: jp
    指定された最倧トヌクン長: 1024
    python lesson7.py -model gpt-4 -lang en
    遞択されたモデル:gpt-4
    遞択された蚀語: en
    指定された最倧トヌクン長: 1024
    $ python lesson7.py -model gpt-4 -lang en -maxtokens 4096
    遞択されたモデル:gpt-4
    遞択された蚀語: en
    指定された最倧トヌクン長: 4096
    $ python lesson7.py -model test -lang fr -maxtokens 10000
    '-lang' の指定が無効です。デフォルト倀 'jp' を䜿甚したす。
    '-maxtokens' の指定が範囲倖です。デフォルト倀 '1024' を䜿甚したす。
    '-model' の指定が無効です。デフォルト倀 'gpt-3.5-turbo' を䜿甚したす。
    遞択されたモデル:gpt-3.5-turbo
    遞択された蚀語: japanese
    指定された最倧トヌクン長: 1024

    実行結果 sample04

    parser.add_argument を䜿っお曞くオプションの名前、デフォルト倀などを蚭定したす。
    args = parser.parse_args() を䜿っお、各オプションの解析をしたす。
    取埗したオプションが想定しおいる範囲内にあるかどうかをチェックしお、範囲倖であれば、デフォルト倀を蚭定したす。
    もちろん、䜕も蚭定しなければ、デフォルト倀が採甚されたす。

    このように、適切なオプションを必芁に応じおコマンドラむンから枡すこずができるようになりたす。

    コマンドラむンパラメヌタを利甚する意味

    プログラムを曞いおいお、状況に応じお蚭定を倉曎するためには、コマンドラむンパラメヌタを利甚するばかりでなく、他の方法を䜿甚するこずができたす。
    ここでは、コマンドラむンパラメヌタを利甚する意味や、それをプログラム䞭でのinput文や蚭定ファむルを読み蟌む方法ず䜿い分ける理由に぀いお説明したす。

    コマンドラむンパラメヌタの利甚意矩

    1. 自動化ずスクリプト化の容易さ コマンドラむンパラメヌタを䜿うず、プログラムをバッチ凊理やスクリプトから簡単に呌び出し、自動化するこずができたす。各皮パラメヌタをプログラム起動時に指定できるため、入力の手間を省き、凊理の自動化が容易になりたす。

    2. 柔軟性ず汎甚性の向䞊 プログラムをより汎甚的にするこずができたす。同じコヌドで異なるデヌタセットを凊理したり、動䜜モヌドを切り替えたりするこずができたす。コマンドラむンパラメヌタを䜿うこずで、プログラムの再利甚性ず柔軟性が高たりたす。

    3. ナヌザヌむンタヌフェヌスの簡玠化 GUIの開発なしに、ナヌザヌがプログラムの動䜜をコントロヌルできる手段を提䟛したす。特に、バック゚ンド凊理やサヌバヌで動䜜するアプリケヌションでは、GUIよりもコマンドラむンの方が適しおいる堎合が倚いです。

    input文や蚭定ファむルずの䜿い分け

    • input文の利甚 ナヌザヌからのむンタラクティブな入力が必芁な堎合や、プログラムの実行䞭にパラメヌタを倉曎する必芁がある堎合に適しおいたす。ただし、自動化やバッチ凊理には䞍向きです。

    • 蚭定ファむルの利甚 耇雑な蚭定や倚数のパラメヌタを管理する堎合に適しおいたす。蚭定ファむルを䜿うこずで、蚭定の倉曎を容易にし、プログラムの再実行が簡単になりたす。しかし、蚭定ファむルの読み蟌みや解析のコヌドを曞く必芁がありたす。

    • コマンドラむンパラメヌタの利甚 スクリプト化や自動化が必芁な堎合、たたは簡単なパラメヌタの倉曎で耇数のモヌドでプログラムを実行したい堎合に最適です。蚭定ファむルよりも即時性があり、input文よりも自動化に適しおいたす。

    たずめ

    コマンドラむンパラメヌタ、input文、蚭定ファむルのどれを䜿うかは、プログラムの甚途や運甚のシナリオによっお異なりたす。自動化の必芁性、パラメヌタの耇雑さ、ナヌザヌずのむンタラクションの必芁性を考慮しお、適切な入力方法を遞択するこずが重芁です。

    党䜓たずめ

    pythonプログラムを起動するずきに蚭定できるコマンドラむンパラメヌタ匕数に぀いお説明したした。
    パラメヌタは、プログラム䞭で通垞のリストずしお扱うこずができ、様々な凊理を蚘述するこずができたす。
    匕き枡されたパラメヌタは、単なる文字列のリストであり、凊理によっおは適切なタむプ倉換や゚ラヌチェックが必芁です。
    パラメヌタを利甚しおオプション蚭定を行う方法を玹介したした。

    このように、コマンドラむンパラメヌタを利甚するこずによっお、プログラりの起動時に様々な蚭定を远加できるようになり、プログラムの汎甚性ず自動化などのスクリプト凊理を甚意に行うこずができたす。GUIアプリを曞くこずも増えたしたが、玠早い凊理や倧量のデヌタ凊理などはタヌミナルコマンドで凊理するほうがはるかに楜なので、コマンドラむンパラメヌタの重芁性が䞋がるこずはないず思いたす。みなさんもぜひ積極的に利甚しおみおください。

    #python #コマンドラむン #パラメヌタ #オプション #デフォルト #コマンドラむンパラメヌタ #プログラム #初歩 #゚ラヌ察策 #リスト #初歩の初歩 #sys .args #args #argparse

    おたけ タむトル画の説明 by gpt-4-vision


    画像は、プログラミングや゜フトりェア開発の抂念を色鮮やかに衚珟したアヌトワヌクです。䞭心に配眮されたパ゜コンの画面には、むラスト化された癜熱電球が描かれ、コヌドの断片が呚りを取り囲んでいたす。手前には、キヌボヌドをタむピングしおいる手があり、暪にはマりスが芋えたす。背景には、様々なアプリケヌションのアむコン、グラフ、メヌル、雲のシンボル、ギアなどがデゞタルな空間を衚珟するための芁玠ずしお描かれおいたす。党䜓的に、デゞタルテクノロゞヌず創造性を象城しおいるビビッドな色合いず掻動的な雰囲気が特城です。


    あなたぞのおすすめ