Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのコマンドライン引数とは?sys.argv・getopt・argparseの使い方を徹底解説

コマンドライン引数とは

コマンドライン引数とは、プログラムの実行時にユーザーが指定できる入力パラメータのことです。これを使うことで、追加情報の出力、特定のファイルやデータソースからの読み込み、データを任意の形式で解釈するなど、プログラムの動作を柔軟に制御できるようになります。

Pythonでコマンドライン引数を扱う主な方法

Pythonには、コマンドライン引数を読み取るための手段が複数用意されています。特によく使われるのが以下の3つです。

  • sys.argv(sysモジュール)
  • getoptモジュール
  • argparseモジュール

1. sysモジュール(sys.argv)

sysモジュールは、コマンドライン引数をリスト形式で保持しており、sys.argv を使って取得できます。引数を文字列として手軽に読み取りたい場合に最適なシンプルな方法です。

import sys

print(type(sys.argv))
print('コマンドライン引数は以下の通りです:')
for i in sys.argv:
    print(i)

このプログラムを実行すると、出力は次のようになります。

実行結果

>python CommandLineOption.py H E L L O
<class 'list'>
コマンドライン引数は以下の通りです:
CommandLineOption.py
H
E
L
L
O

このように、スクリプト名自身が最初の要素(インデックス0)に入り、以降に渡された引数が順番に格納されます。

2. getoptモジュール

getoptモジュールは、sys.argvのような引数列を解析し、「オプションとその値のペアのリスト」と「オプション以外の残りの引数リスト」を返します。C言語風のオプション指定(-a や --long-option など)を扱いたい場合に便利です。

構文

getopt.getopt(args, options, [long_options])

各引数の意味は次の通りです。

  • args:解析対象となる引数のリスト
  • options:スクリプトが認識する短いオプション文字の文字列(引数を取るオプションには「:」を付ける)
  • long_options:省略可能なパラメータ。サポートする長いオプション名の文字列リスト(引数を取る場合は「=」を付ける)

getoptモジュールで利用できるオプションの記法は以下の通りです。

  • -a
  • -bval
  • -b val
  • --noarg
  • --witharg=val
  • --witharg val

短い形式のオプションの例

次のプログラムは2つのオプションを受け取ります。-a は引数なし、-b は引数が必要なオプションです。

import getopt
print(getopt.getopt(['-a', '-bval', '-c', 'val'], 'ab:c:'))

実行結果

[('-a', ''), ('-b', 'val'), ('-c', 'val')], [])

長い形式のオプションの例

長いオプションを使う場合、long_options には ['noarg', 'witharg=', 'witharg2='] のようなリストを指定します。

import getopt
print(getopt.getopt(
    ['--noarg', '--witharg', 'val', '--witharg2=another'],
    '',
    ['noarg', 'witharg=', 'witharg2=']
))

実行結果

[('--noarg', ''), ('--witharg', 'val'), ('--witharg2', 'another')], [])

getoptモジュールの実践的な使用例

import getopt
import sys

argv = sys.argv[1:]
try:
    opts, args = getopt.getopt(argv, 'hm:d', ['help', 'my_file='])
    print(opts)
    print(args)
except getopt.GetoptError:
    print('エラーが発生しました!')
    sys.exit(2)

実行結果

>python CommandLineOption.py -m 2 -h "Help" H E L L O
[('-m', '2'), ('-h', '')]
['Help', 'H', 'E', 'L', 'L', 'O']

この例では、オプション部分(-m 2 と -h)が opts に、それ以外の位置引数(Help, H, E, L, L, O)が args に分離されて格納されていることがわかります。

3. argparseモジュール

argparseモジュールは、Pythonでコマンドライン引数を解析する際に公式に推奨されている標準的な方法です。位置引数の定義、デフォルト値の設定、自動生成されるヘルプメッセージ、引数のデータ型指定など、高機能ながら使いやすいインターフェースが特徴です。

以下はargparseモジュールの基本的な使い方を示すシンプルなサンプルです。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("string", help="受け取った単語を大文字で出力します")
args = parser.parse_args()
print(args.string.upper())  # 引数はこのように操作できる

実行結果

>python CommandLineOption.py "Hello, pythoN"
HELLO, PYTHON

さらに、argparseでは「--verbosity」のようなオプション引数(フラグ)も簡単に設定できます。ヘルプ表示(-h / --help)も自動的に用意されるため、本格的なCLIツールを作るならargparse一択と言えるでしょう。

  1. Pythonの名前空間と変数のスコープを徹底解説!LEGBルールで名前解決の仕組みを理解しよう

    Pythonにおける名前空間(Namespace)とは?名前空間(Namespace)とは、変数名とその実体(オブジェクト)を対応付ける仕組みであり、スコープを実現するための基盤となるものです。Pythonでは、パッケージ・モジュール・クラス・関数・メソッドといったそれぞれの単位が、独自の「名前空間」を持っています。関数やモジュール、パッケージが評価されて実行が始まると、そのための名前空間が新しく作成されます。これは「評価コンテキスト」と考えると分かりやすいでしょう。そして、実行が終了すると、その名前空間は破棄され、そこに存在していた変数も一緒に消えます。さらに、ローカルの名前空間に目的の名前

  2. EclipseのコマンドラインでPython関数を実行する方法

    ```html Eclipse上でPythonプログラムを開発・実行するには、PyDevというプラグインを利用するのが一般的です。PyDevを導入すると、Eclipseから直接Pythonアプリケーションを実行できるだけでなく、PyDevコンソール(コマンドライン)を使って対話的にコードを動かすことも可能になります。 PyDevのインストール まず、Eclipse Marketplaceまたは「ヘルプ」→「新規ソフトウェアのインストール」からPyDevをインストールします。インストール後、Pythonインタープリターのパスを設定すれば、開発環境の準備は完了です。 コマンドライン(PyDev