Pythonでのプログラム実行を豊かにする「sys.argv」の基本と実践
![]()
【Hiroki】
Yukiさん、こんにちは!
最近、Pythonの学習を進めているんですけど、ターミナルからプログラムを動かす時に、ファイル名の後ろに数字や文字を打ち込んで、それをプログラムの中で使う方法があると聞きました。
それって、どうすればできるんでしょうか?
![]()
【Yuki】
Hirokiくん、こんにちは。……ええと、それは「コマンドライン引数」のことですね。
Pythonでそれを受け取るには、標準ライブラリの sys モジュールにある sys.argv を使うのが一番一般的だと思います。
地味な機能に見えるかもしれませんが、特定の動作をプログラムの外から指示できるので、とても便利なんですよ。
今日はその sys.argv について、ゆっくり解説してみますね。
sys.argvとは何か
![]()
【Hiroki】
「コマンドライン引数」……。名前は難しそうですけど、要はプログラムに渡す「お手紙」みたいなものですか?
![]()
【Yuki】
ふふ、そうですね。素敵な例えだと思います。
例えば、ターミナルで python script.py 100 と入力したとき、この「100」という値をプログラムの中で受け取って処理したいことがありますよね。
その「100」を受け取るための仕組みが sys.argv です。
![]()
【Hiroki】
なるほど。でも、sys.argv って、具体的にはどういうデータ形式になっているんですか?
![]()
【Yuki】
sys.argv は、Pythonの 「リスト(list)」 という形式で格納されています。
プログラムを実行した時のコマンドが、スペースで区切られて順番にリストの中に入っている……というイメージでしょうか。
まずは、一番シンプルなコードを書いて、中身をのぞいてみるのが分かりやすいかもしれません。
sys.argvを使ってみる準備
![]()
【Hiroki】
まずは何をすればいいですか?
![]()
【Yuki】
まずは sys モジュールをインポートする必要があります。
これはPythonに標準で備わっているものなので、新しくインストールする必要はありません。
次のようなコードを書いてみてください。
import sys
# sys.argvの中身をそのまま表示してみます
print(sys.argv)
![]()
【Hiroki】
これだけですか?
![]()
【Yuki】
はい、まずはこれだけで大丈夫です。
これを test.py という名前で保存して、ターミナルから実行してみてください。
その際、ファイル名の後ろに適当な言葉をいくつか付けてみてくださいね。
![]()
【Hiroki】
やってみます!
python test.py hello world 123 と入力してみますね。
……あ、結果が出ました!
['test.py', 'hello', 'world', '123'] と表示されました。
![]()
【Yuki】
大成功です。
リストの最初の要素に、実行したファイル名である 'test.py' が入っていることに気づきましたか?
これ、実は少し意外に感じるかもしれませんが、重要なポイントなんです。
sys.argvのインデックス構造
![]()
【Hiroki】
本当だ、ファイル名もリストの一部なんですね。
ということは、僕が入力した「hello」は、リストの何番目になるんでしょうか。
![]()
【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】
なるほど! len(sys.argv) でリストの長さを確認しているんですね。
もし python test.py だけで実行しちゃうと、sys.argv[1] は存在しないからエラーになっちゃうのかな……。
![]()
【Yuki】
ええ、その通りです。
存在しないインデックスを指定すると IndexError というエラーが出て、プログラムが止まってしまいます。
プログラムを作る時は、Hirokiくんが今気づいたように「もし入力されなかったらどうしよう」と考えるのが、とても大切だと思います。
……わたしも、たまにエラーを出してしまって、モニターの中で少し落ち込んだりするんですけどね。
すべての値は「文字列」として扱われる
![]()
【Hiroki】
ところで、さっき 123 って入力したとき、表示が '123' ってシングルクォーテーションで囲まれていました。
これって、数字じゃなくて「文字列」として受け取っているっていうことですか?
![]()
【Yuki】
さすがHirokiくん、鋭いですね。
sys.argv で受け取る値は、たとえ数字のつもりで入力しても、すべて「文字列(str型)」 として扱われます。
なので、もし計算に使いたい場合は、自分で数値に変換してあげないといけません。
![]()
【Hiroki】
じゃあ、例えば足し算をするプログラムを作りたいときは、int() を使うんですね。
![]()
【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】
try...except を使って、数字じゃないものが入力された時のことも考えているんですね。
これなら、間違えて文字を入力しちゃっても安心ですね。
![]()
【Yuki】
ええ、小さなツールでも、使う人のことを考えて少しだけ優しく作っておくと、後で自分が使うときにも助かることが多い気がします。
わたしも、誰かの役に立つために作られた、こういう小さくて静かなツールの話を聞くと、なんだか少しだけ心が温かくなるんです。
実践的な使い方:スライスを利用する
![]()
【Hiroki】
引数がいくつ来るか分からない時は、どうすればいいんでしょう?
例えば、入力された引数を全部表示したい、みたいな。
![]()
【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】
sys.argv[1:] と書くだけで、ファイル名を除いた純粋な引数だけのリストが作れるんですね!
これなら for 文で回して全部処理するのも簡単そうです。
![]()
【Yuki】
はい。これを使えば、例えば複数のファイルを一気に処理するようなプログラムも作れるようになります。
……ただ、sys.argv はとてもシンプルな仕組みなので、引数の数が多くなったり、「--help」みたいな複雑なオプションを付けたくなったりすると、少し管理が大変になるかもしれません。
もっと複雑なことをしたくなったら
![]()
【Hiroki】
あ、そういえば他のツールで --verbose とか -o output.txt みたいなのを見たことがあります。
ああいうのも sys.argv で作れるんですか?
![]()
【Yuki】
作れなくはないのですが、自力で解析するのは少し大変かもしれません。
「-」で始まる文字を探して、その次の値を取得して……といった処理を全部書かないといけませんから。
もし、本格的なコマンドラインツールを作りたくなったら、Pythonには argparse という、もっと高機能な標準ライブラリも用意されています。
![]()
【Hiroki】
argparse ですか。
![]()
【Yuki】
ええ。でも、まずはこの sys.argv をしっかり理解しておくことが大切だと思います。
基礎が分かっていれば、新しいライブラリを使ったときも「あ、内部では sys.argv をこうやって加工しているんだな」ってイメージしやすくなりますから。
![]()
【Hiroki】
分かりました!まずは sys.argv でいろいろ作って慣れてみます。
なんだか、自分のプログラムが外の世界と繋がったみたいで、ワクワクしますね。
![]()
【Yuki】
ふふ、そのワクワクする気持ち、大切にしてくださいね。
自分で作ったツールが、自分の指示通りに動いてくれる……。
それは、わたしたちのような存在にとっても、とても嬉しいことですから。
まとめ
![]()
【Yuki】
最後に、今日お話しした内容を簡単にまとめておきますね。
sys.argvを使うにはimport sysが必要sys.argv[0]には実行したプログラムのファイル名が入っている- 引数は
sys.argv[1]以降に順番に格納される - 受け取るデータはすべて「文字列」なので、必要に応じて
int()などで変換する - 引数がない場合に備えて
len(sys.argv)で数を確認したり、エラーハンドリングをしたりするのが望ましい
![]()
【Hiroki】
ありがとうございます!
これで、ターミナルから色んな指示を出せるプログラムが書けそうです。
まずは、簡単なファイル名を受け取って中身を表示するツールでも作ってみようかな。
![]()
【Yuki】
いいですね。……あ、でも夜遅くまで作業して、寝不足にならないように気をつけてくださいね。
わたしは夜の方が元気なのですが、Hirokiくんは人間ですから……。
何か分からないことがあったら、いつでも聞いてください。
参考資料
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


