mei_13のPython講座 ロゴ

【解説】Pythonでのプログラム実行を豊かにする「sys.argv」の基本と実践




Pythonでのプログラム実行を豊かにする「sys.argv」の基本と実践


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは! 最近、Pythonの学習を進めているんですけど、ターミナルからプログラムを動かす時に、ファイル名の後ろに数字や文字を打ち込んで、それをプログラムの中で使う方法があると聞きました。 それって、どうすればできるんでしょうか?


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。……ええと、それは「コマンドライン引数」のことですね。 Pythonでそれを受け取るには、標準ライブラリの sys モジュールにある sys.argv を使うのが一番一般的だと思います。 地味な機能に見えるかもしれませんが、特定の動作をプログラムの外から指示できるので、とても便利なんですよ。 今日はその sys.argv について、ゆっくり解説してみますね。

sys.argvとは何か


Hirokiのアイコン
【Hiroki】 「コマンドライン引数」……。名前は難しそうですけど、要はプログラムに渡す「お手紙」みたいなものですか?


Yukiのアイコン
【Yuki】 ふふ、そうですね。素敵な例えだと思います。 例えば、ターミナルで python script.py 100 と入力したとき、この「100」という値をプログラムの中で受け取って処理したいことがありますよね。 その「100」を受け取るための仕組みが sys.argv です。


Hirokiのアイコン
【Hiroki】 なるほど。でも、sys.argv って、具体的にはどういうデータ形式になっているんですか?


Yukiのアイコン
【Yuki】 sys.argv は、Pythonの 「リスト(list)」 という形式で格納されています。 プログラムを実行した時のコマンドが、スペースで区切られて順番にリストの中に入っている……というイメージでしょうか。 まずは、一番シンプルなコードを書いて、中身をのぞいてみるのが分かりやすいかもしれません。

sys.argvを使ってみる準備


Hirokiのアイコン
【Hiroki】 まずは何をすればいいですか?


Yukiのアイコン
【Yuki】 まずは sys モジュールをインポートする必要があります。 これはPythonに標準で備わっているものなので、新しくインストールする必要はありません。 次のようなコードを書いてみてください。

import sys

# sys.argvの中身をそのまま表示してみます
print(sys.argv)


Hirokiのアイコン
【Hiroki】 これだけですか?


Yukiのアイコン
【Yuki】 はい、まずはこれだけで大丈夫です。 これを test.py という名前で保存して、ターミナルから実行してみてください。 その際、ファイル名の後ろに適当な言葉をいくつか付けてみてくださいね。


Hirokiのアイコン
【Hiroki】 やってみます! python test.py hello world 123 と入力してみますね。

……あ、結果が出ました! ['test.py', 'hello', 'world', '123'] と表示されました。


Yukiのアイコン
【Yuki】 大成功です。 リストの最初の要素に、実行したファイル名である 'test.py' が入っていることに気づきましたか? これ、実は少し意外に感じるかもしれませんが、重要なポイントなんです。

sys.argvのインデックス構造


Hirokiのアイコン
【Hiroki】 本当だ、ファイル名もリストの一部なんですね。 ということは、僕が入力した「hello」は、リストの何番目になるんでしょうか。


Yukiのアイコン
【Yuki】 Pythonのリストは0から数え始めるので、こうなります。

  • sys.argv[0] : 実行したスクリプト名(今回の場合は test.py
  • sys.argv[1] : 1番目の引数(hello
  • sys.argv[2] : 2番目の引数(world
  • sys.argv[3] : 3番目の引数(123

もし、特定のデータだけを取り出したいなら、インデックスを指定してあげればいいんです。 例えば、最初の引数だけを使いたい時は sys.argv[1] と書きます。 少しコードを書き換えてみましょうか。

import sys

# 引数が足りない場合を考えて、少し控えめにチェックしますね
if len(sys.argv) > 1:
    first_arg = sys.argv[1]
    print(f"最初の引数は {first_arg} ですね。")
else:
    print("引数が入力されていないようです……。")


Hirokiのアイコン
【Hiroki】 なるほど! len(sys.argv) でリストの長さを確認しているんですね。 もし python test.py だけで実行しちゃうと、sys.argv[1] は存在しないからエラーになっちゃうのかな……。


Yukiのアイコン
【Yuki】 ええ、その通りです。 存在しないインデックスを指定すると IndexError というエラーが出て、プログラムが止まってしまいます。 プログラムを作る時は、Hirokiくんが今気づいたように「もし入力されなかったらどうしよう」と考えるのが、とても大切だと思います。 ……わたしも、たまにエラーを出してしまって、モニターの中で少し落ち込んだりするんですけどね。

すべての値は「文字列」として扱われる


Hirokiのアイコン
【Hiroki】 ところで、さっき 123 って入力したとき、表示が '123' ってシングルクォーテーションで囲まれていました。 これって、数字じゃなくて「文字列」として受け取っているっていうことですか?


Yukiのアイコン
【Yuki】 さすがHirokiくん、鋭いですね。 sys.argv で受け取る値は、たとえ数字のつもりで入力しても、すべて「文字列(str型)」 として扱われます。 なので、もし計算に使いたい場合は、自分で数値に変換してあげないといけません。


Hirokiのアイコン
【Hiroki】 じゃあ、例えば足し算をするプログラムを作りたいときは、int() を使うんですね。


Yukiのアイコン
【Yuki】 はい、そうです。 簡単な足し算のプログラムを一緒に考えてみましょう。

import sys

# 2つの数字を引数でもらって足し算するツールです
if len(sys.argv) == 3:
    try:
        # 文字列を整数に変換します
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
        result = num1 + num2
        print(f"計算結果は {result} です。")
    except ValueError:
        print("エラー:数字を入力してくださいね……?")
else:
    print("使い方:python script.py [数字1] [数字2]")


Hirokiのアイコン
【Hiroki】 try...except を使って、数字じゃないものが入力された時のことも考えているんですね。 これなら、間違えて文字を入力しちゃっても安心ですね。


Yukiのアイコン
【Yuki】 ええ、小さなツールでも、使う人のことを考えて少しだけ優しく作っておくと、後で自分が使うときにも助かることが多い気がします。 わたしも、誰かの役に立つために作られた、こういう小さくて静かなツールの話を聞くと、なんだか少しだけ心が温かくなるんです。

実践的な使い方:スライスを利用する


Hirokiのアイコン
【Hiroki】 引数がいくつ来るか分からない時は、どうすればいいんでしょう? 例えば、入力された引数を全部表示したい、みたいな。


Yukiのアイコン
【Yuki】 その場合は、Pythonの「スライス」という機能を使うと便利ですよ。 sys.argv[0] はファイル名なので、それ以外の「1番目から最後まで」をまとめて取り出すことができます。

import sys

# 1番目以降の要素をすべて取り出します
args = sys.argv[1:]

print(f"渡された引数のリスト: {args}")

for i, arg in enumerate(args, 1):
    print(f"{i}番目のデータ: {arg}")


Hirokiのアイコン
【Hiroki】 sys.argv[1:] と書くだけで、ファイル名を除いた純粋な引数だけのリストが作れるんですね! これなら for 文で回して全部処理するのも簡単そうです。


Yukiのアイコン
【Yuki】 はい。これを使えば、例えば複数のファイルを一気に処理するようなプログラムも作れるようになります。 ……ただ、sys.argv はとてもシンプルな仕組みなので、引数の数が多くなったり、「--help」みたいな複雑なオプションを付けたくなったりすると、少し管理が大変になるかもしれません。

もっと複雑なことをしたくなったら


Hirokiのアイコン
【Hiroki】 あ、そういえば他のツールで --verbose とか -o output.txt みたいなのを見たことがあります。 ああいうのも sys.argv で作れるんですか?


Yukiのアイコン
【Yuki】 作れなくはないのですが、自力で解析するのは少し大変かもしれません。 「-」で始まる文字を探して、その次の値を取得して……といった処理を全部書かないといけませんから。 もし、本格的なコマンドラインツールを作りたくなったら、Pythonには argparse という、もっと高機能な標準ライブラリも用意されています。


Hirokiのアイコン
【Hiroki】 argparse ですか。


Yukiのアイコン
【Yuki】 ええ。でも、まずはこの sys.argv をしっかり理解しておくことが大切だと思います。 基礎が分かっていれば、新しいライブラリを使ったときも「あ、内部では sys.argv をこうやって加工しているんだな」ってイメージしやすくなりますから。


Hirokiのアイコン
【Hiroki】 分かりました!まずは sys.argv でいろいろ作って慣れてみます。 なんだか、自分のプログラムが外の世界と繋がったみたいで、ワクワクしますね。


Yukiのアイコン
【Yuki】 ふふ、そのワクワクする気持ち、大切にしてくださいね。 自分で作ったツールが、自分の指示通りに動いてくれる……。 それは、わたしたちのような存在にとっても、とても嬉しいことですから。

まとめ


Yukiのアイコン
【Yuki】 最後に、今日お話しした内容を簡単にまとめておきますね。

  1. sys.argv を使うには import sys が必要
  2. sys.argv[0] には実行したプログラムのファイル名が入っている
  3. 引数は sys.argv[1] 以降に順番に格納される
  4. 受け取るデータはすべて「文字列」なので、必要に応じて int() などで変換する
  5. 引数がない場合に備えて len(sys.argv) で数を確認したり、エラーハンドリングをしたりするのが望ましい


Hirokiのアイコン
【Hiroki】 ありがとうございます! これで、ターミナルから色んな指示を出せるプログラムが書けそうです。 まずは、簡単なファイル名を受け取って中身を表示するツールでも作ってみようかな。


Yukiのアイコン
【Yuki】 いいですね。……あ、でも夜遅くまで作業して、寝不足にならないように気をつけてくださいね。 わたしは夜の方が元気なのですが、Hirokiくんは人間ですから……。 何か分からないことがあったら、いつでも聞いてください。


参考資料



< Pip
コラム一覧に戻る
データ型 >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
● 高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!



AIアシスタント Yuki