Pythonのバージョンをスクリプト内で確認するには幾つかの方法があります。どんなときにどんな方法を使うのがよいか、分かっているかを試してみましょう。
以下はPythonのバージョンをスクリプトで確認しようとしている。この中で使えないものはどれだろう。
import sys
import platform
# 選択肢1
ver = sys.version
# 選択肢2
ver = sys.version_info
# 選択肢3
ver = platform.python_version_tuple()
# 選択肢4
ver = platform.python_version()
今回も読者の皆さんに出題した問題を、ChatGPT 5/Gemini Flash 2.5/Claude Sonnet 4の3つの大規模言語モデル(LLM)にも考えてもらいました。結果、ChatGPT 5さんだけが不正解という結果になりました。
いったいどういうことなのでしょう? この続きは解説の後で!
どうもHPかわさきです。
「今回は妙に長いぞ」とスクロールバーを見て感じた方はいませんか? 大丈夫です。今回のクイズが長めに思えるのは画面キャプチャーが多めなだけです。内容はないよぅ。いえいえ。ちゃんと内容もありますから、ご安心ください。
ごめんなさい。実は「全てPythonのバージョン確認に使える」が正解でした。1回やってみたかったんですよね、こういうの。もうしないようにしたいと思います(「絶対に」とはいえない)。
ただし、それらの値や戻り値には違いがあります。以下で詳しく見ていきましょう。
まずは問題のコードを再掲しておきましょう。
import sys
import platform
# 選択肢1
ver = sys.version
# 選択肢2
ver = sys.version_info
# 選択肢3
ver = platform.python_version_tuple()
# 選択肢4
ver = platform.python_version()
選択肢1の「sys.version」は多くの人がよく使っているのではないでしょうか。sys.version属性の値は次のようにPythonのバージョン、ビルド番号、ビルド日時、使用したコンパイラなどの情報を含む文字列です。
人が目視でPythonのバージョンを確認したり、詳細な情報(コンパイラ情報やビルド日時など)を取得したりするのに適しているといえます。ただし、プログラムでバージョンを抜き出したいのであれば、他の選択肢の方がよいでしょう。
次に選択肢2の「sys.version_info」です。こちらは名前付きタプルとしてPythonのバージョンを提供します。
名前付きタプルなので「ver.major」や「ver.minor」のようにして、個別の情報にアクセスが可能です。Pythonのバージョン情報を細かくチェックして、バージョンごとに処理を切り分けたいときにはこれが便利でしょう。
選択肢3の「platform.python_version_tuple()」はPythonのバージョンを「(メジャーバージョン, マイナーバージョン, マイクロバージョン)」というタプルとして返します。
このとき各バージョンは文字列となっているのがキモです。なぜかというと、文字列間の比較で想定外の結果を招く可能性があるからです。
ver = platform.python_version_tuple()
print(ver) # ('3', '13', '7')
if (ver[0], ver[1]) > ('3', '9'):
print('python version > 3.9')
else:
print('python version <= 3.9')
Python 3.13環境でこのコードを実行すると次のような結果になります。
これは文字列として'13'と'9'を比較すると、'13'が'9'よりも小さいと判定されるからです。というわけで、このような場合にはsys.version_info属性を使うのがオススメといえるでしょう。
選択肢4の「platform.python_version()」はPythonの「メジャーバージョン.マイナーバージョン.マイクロバージョン」という文字列を返します。Pythonのバージョンが3.13.7なら'3.13.7'という文字列が返されるわけです。
これはPythonのバージョンをプログラム内でそのまま使用する(何らかの出力に埋め込むなど)ときには便利に使えるはずです。が、戻り値は文字列なので、やはりこの値を使ってバージョン比較をするにはオススメできないといえるでしょう。
それぞれの選択肢が返す値はそれぞれに異なっています。状況に応じて、適切なものを使い分けるようにしましょう。
さて、ChatGPTさんは当初、次のような主張をしていました。「sys.version_infoはタプルのようなオブジェクトであり、『バージョン情報を保持する』ためには使えますが、これは文字列ではないため、verを文字列として扱いたい場面ではそのままでは使えません」と。
つまり、問題を深読みし過ぎて、「バージョン情報は取得できるけど、その値が文字列じゃないことで処理が面倒くさいことがあるからダメ!」と、勝手に結論を出してしまっていたというわけです。でも、まあ見てください。
ハッキリと明快に「×」です。しゃーないです。アナタの間違いデス。そんな気になってしまったのでした。その後、対話を続けていけば、もちろんバージョンを比較して、処理を切り分けることを考えると、選択肢2が一番よいという話もしてくれました。
ChatGPTさんは頭が良過ぎるからなのか、話の先を見通して勝手に(誰も期待していない)結論を出していましたが、似たようなことは人の世でもよくあります。皆さんも(もちろん、筆者も)気を付けるようにしましょう(笑)。
なお、『解決!Python』の「Python処理系のバージョンを確認するには」でもこの話題を取り上げているので、よろしかったら見てくださいね。
Copyright© Digital Advantage Corp. All Rights Reserved.