スクリプトを実行しているPythonのバージョンを確認するにはどうすればよいですか?


1185

スクリプトを解釈しているPythonインタープリターのバージョンを確認するにはどうすればよいですか?


1
現在のスレッドは、Pythonプログラム/スクリプトからPythonバージョンをチェックすることです。コマンドラインからマシンにインストールされているpythonインタープリターのバージョンを確認する場合は、次の投稿を参照してください- インストールされているPythonのバージョンは?
RBT 2018

1
ここにpython 3と2を分離する楽しい方法があります...python_version = int(str(range(3))[-2])
Chris_Rands

@RBT:コマンドラインからの1行のチェックについては、私の回答を参照しください。
smci

回答:


1378

この情報は、sysモジュールのsys.version文字列で利用できます。

>>> import sys

人間が読める:

>>> print(sys.version)  # parentheses necessary in python 3.       
2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]

さらなる処理のために:

>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192

Pythonインタープリターの最小バージョン要件でスクリプトを実行するには、これをコードに追加します。

assert sys.version_info >= (2, 5)

これにより、メジャーバージョン情報とマイナーバージョン情報が比較されます。(=マイクロ追加01(=、など)、さらにはreleaselevelを'alpha''final'好きなようにタプルに、など)。ただし、ほとんどの場合、特定の機能が存在するかどうかを「確認」することをお勧めします。存在しない場合は、回避策(または救済)を実行することをお勧めします。新しいリリースでは機能が廃止され、他の機能に置き換えられる場合があります。


39
実際には、印刷の構文です。バージョンの確認用ではありません。私は私のpython 2と3のスクリプトでそれを使用しますPY3 = sys.version_info[0] == 3
GCB

5
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
xiaoweiz

25
の一部のフィールドにsys.version_infoプロパティとしてアクセスすることもできるためPY3 = sys.version_info.major == 3、もう少し魅力的かもしれません。
krs013 2016

1
注:sys.hexversionは0x020502F0と比較されます。docs.python.org/ 2 / library / sys.html#sys.hexversion
Ehrlich

1
@gcbコードスニペットは、Python 4が発生するたびに壊れます。あなたがすべきですif sys.version_info >= (3,)。異なるサイズのタプルを比較するのは完全にpythonicであり、正しいことを行います。
ボリス

374

コマンドラインから(大文字の「V」に注意):

python -V

これは「man python」で文書化されています。


13
大文字Vは小文字ではなくバージョンです
Rogue

96

sys.hexversionこのようなものが好きです。

http://docs.python.org/library/sys.html#sys.hexversion

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True

これは私が見たことのない気の利いたバージョンの機能であり、通常のバージョンよりも(少なくとも私にとっては)少し使いやすい...
Wayne Werner

6
@sorin:これがたとえばSethの答えよりも優れていることを説明できますか?あなたはこれが最高だと言っているので、私は不思議に思っています。
0xC0000022L 2013年

3
@ 0xC0000022Lタプルのテキストをどのように比較できるのか疑問に思ったことはありませんか?「final」は、ベータ、rc、またはそこに存在する可能性のあるものと比較して 代わりに、数値がある場合は、常に正確なバージョンを指定できます。
ソリン2013年

1
@sorin:ええと、それは厳密には関係ありませんよね?と比較し(2,6,4)'final'も、比較に影響はないようで、そうではありません。タプルの「最も重要な」部分を比較するとき、明らかにスライスは必要ありません。これはそれがどのように扱われるかであり、それが私の質問に関するものです。このソリューションにメリットがないと言っているのではありません。なぜそれがベストなのか、つまり、何が足りないのか疑問に思っています。
0xC0000022L 2013年

11
リリースレベルは、 'alpha'、 'beta'、 'candidate'、または 'final'のいずれかと定義されていますが、これもたまたま正しく比較されます...
Fredrik

65

あなたの最善の策はおそらくそのようなものです:

>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not sys.version_info[:2] == (2, 6):
...    print "Error, I need python 2.6"
... else:
...    from my_module import twoPointSixCode
>>> 

さらに、常にインポートを単純な試行でラップできます。これにより、構文エラーをキャッチできます。そして、@ Heikkiの要点として、このコードは古いバージョンのpythonと互換性があります。

>>> try:
...     from my_module import twoPointSixCode
... except Exception: 
...     print "can't import, probably because your python is too old!"
>>>

3
なぜ単純な例外であり、ImportErrorではないのですか?:P
2013年

4
@deadly-ImportErrorはSyntaxErrorsをキャッチしません。これは、2.5より前のバージョンで条件付きショートカットを使用するなど、古いPythonで新しい構文を使用しようとするとスローされます。
Seth

except Exception広すぎます。あなたが期待する特定の例外を使う方が良いのではないでしょうか?
フェルミパラドックス

1
@Fermiparadox-ブロードであることは、仮定を低く抑えます。このexcept Exception:ライン自体は、すでに最新の(2.x +)Pythonを想定しています。たぶんいくつかの将来のpythonはいくつかの後方互換性のない方法で例外名を再配置しますか?(おそらくそうではありませんが、20年間にpythonがどのように見えるかは、オクルスリフトの眼球インプラントがある場合は誰が知っていますか?コードは長期間続きます。)
セス

65

stdlib platformpython_versionを使用します。

>>> from platform import python_version
>>> print(python_version())
2.7.8

5
印刷機能については、互換性を考慮し、括弧内の方が良いでしょう。誰かがバージョン3のサンプルを使用すると、構文エラーが発生します。
アレックスチェン

47

次のようなものを入れてください:

#!/usr/bin/env/python
import sys
if sys.version_info<(2,6,0):
  sys.stderr.write("You need python 2.6 or later to run this script\n")
  exit(1)

スクリプトの上部。

スクリプトの他の内容によっては、ターゲットより古いバージョンのpythonはスクリプトをロードすることさえできない場合があるため、このエラーを報告するのに十分ではないことに注意してください。回避策として、より新しいコードでスクリプトをインポートするスクリプトで上記を実行できます。


6
古いインタープリターがのような新しい言語構成要素に干渉するため、これは正しくありません(または少なくとも不完全です)x if Pred() else y。これらは「字句解析」フェーズで死に、実際に実行する 機会はありませんexit(1)セスの答えは、新しい言語機能を他のファイルにカプセル化することにおいて正しいです。
Mark Rushakoff

2
@MarkRushakoff:コメントがわかりにくい。この回答のどの側面が間違っていますか?不足しているelseブランチまたはそのa <が使用されていversion_infoますか?AFAIK Pythonはタプルの欠損値を埋め込んでいますが、これはすべて2.6より前に有効であるはずです。違いますか?したがって、セスの回答ではスライシングが(冗長に)使用されていますが、スライシングでは使用されておらず、コメントがさらにわかりにくくなっています。
0xC0000022L 2013年

5
@MarkRushakoffが言っていることは、ファイルの上部にこれがあり、同じファイルの他の場所に新しい言語機能がある場合、古いバージョンのPythonは、ファイルをロードするときに、それを実行する前に死ぬということですしたがって、エラーは表示されません。基本的には、上記(または別のチェック)をファイルの先頭に配置し、新しいバージョンのpythonを必要とするコードを別のファイルからインポートする必要があります。
rjmunro 2013年

1
うん、@ rjmunroの発言:)
Mark Rushakoff 2013年

25

すぐに終了する短いコマンドラインバージョンを次に示します(スクリプトと自動実行に便利です)。

python -c "print(__import__('sys').version)"

またはメジャー、マイナー、マイクロのみ:

python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)

1
@vigilancerあなたの言うとおり、執筆時点ではまだ関連性はありませんでしたが、Python 3向けに更新しました:)
Wolph

これpython2 --versionpython3 --version、PHPの出力をキャプチャしてバージョン番号を取得していた問題が解決しました。私は後者を介して問題なく後者を取得passthru()しますが、前者はファイルにリダイレクトされた場合でも、画面に印刷されるだけでキャプチャされません...
Tox

1
@tox print() より便利な場合は、ファイルに書き込むように指示できます。
Wolph、

私の場合、それはすでにpassthru()出力をファイルにリダイレクトしているのと同じです。あなたのソリューションは私が必要としていることを正確に行います。:)
Tox

14

ではsixモジュール、あなたはそれをすることによって行うことができます。

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x

8
import sys
sys.version.split(' ')[0]

sys.versionは必要なものを提供します。最初の番号を選択してください:)


5

最も簡単な方法

端末にpythonと入力するだけで、次のようにバージョンを確認できます

desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

23
「最も簡単な方法」 ...要求されたものとは異なることを行う。
Luc

4

Sethが言ったように、メインスクリプトはチェックできますsys.version_info(ただし、2.0までは表示されなかったため、古いバージョンをサポートする場合は、sysモジュールの別のバージョンプロパティをチェックする必要があります)。

ただし、古いPythonバージョンでは利用できないPython言語機能をファイルで使用しないように注意する必要があります。たとえば、これはPython 2.5以降で許可されています。

try:
    pass
except:
    pass
finally:
    pass

しかし、Pythonの古いバージョンでは機能しません。なぜなら、except ORが最後に一致するものしかなかったためです。したがって、古いバージョンのPythonとの互換性のために、次のように記述する必要があります。

try:
    try:
        pass
    except:
        pass
finally:
    pass

2

いくつかの回答は、現在のpythonバージョンをクエリする方法をすでに示唆しています。プログラムでバージョン要件を確認するには、次の2つの方法のいずれかを使用します。

# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))

# Method 2: 
import platform
from distutils.version import StrictVersion 
assert(StrictVersion(platform.python_version()) >= "2.6")

2

面白くするために、以下はCPython 1.0-3.7b2、Pypy、JythonおよびMicropythonでそれを行う方法です。これは、現代のコードでそれを行う方法よりも好奇心の強いものです。私はhttp://stromberg.dnsalias.org/~strombrg/pythons/の一部としてそれを書きました、それは一度に多くのバージョンのpythonでコードのスニペットをテストするためのスクリプトなので、あなたは簡単にどのpythonの感覚をつかむことができます機能は、Pythonのどのバージョンと互換性があります。

via_platform = 0
check_sys = 0
via_sys_version_info = 0
via_sys_version = 0
test_sys = 0
try:
    import platform
except (ImportError, NameError):
    # We have no platform module - try to get the info via the sys module
    check_sys = 1

if not check_sys:
    if hasattr(platform, "python_version"):
        via_platform = 1
    else:
        check_sys = 1

if check_sys:
    try:
        import sys
        test_sys = 1
    except (ImportError, NameError):
        # just let via_sys_version_info and via_sys_version remain False - we have no sys module
        pass

if test_sys:
    if hasattr(sys, "version_info"):
        via_sys_version_info = 1
    elif hasattr(sys, "version"):
        via_sys_version = 1
    else:
        # just let via_sys remain False
        pass

if via_platform:
    # This gives pretty good info, but is not available in older interpreters.  Also, micropython has a
    # platform module that does not really contain anything.
    print(platform.python_version())
elif via_sys_version_info:
    # This is compatible with some older interpreters, but does not give quite as much info.
    print("%s.%s.%s" % sys.version_info[:3])
elif via_sys_version:
    import string
    # This is compatible with some older interpreters, but does not give quite as much info.
    verbose_version = sys.version
    version_list = string.split(verbose_version)
    print(version_list[0])
else:
    print("unknown")

2

Pythonのバージョンを確認する:python -Vまたはpython --versionまたはapt-cache policy python

を実行whereis pythonして、インストールされているバージョンの数を確認することもできます。


3
同じ答えがすでに投稿されています。そして、問題は「インストールしたPythonのバージョンを確認するにはどうすればよいですか」ではありません。しかし、「スクリプトでバージョンを確認するにはどうすればよいですか」。
Stanley Kou

2

Python 3より前のバージョンを検出し、何もインポートしたくない場合...

...リスト内包範囲の変更を(ab)使用して、単一の式でそれを行うことができます

is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)

2

WindowsでコマンドのPythonバージョンを確認するには、コマンドプロンプトで次のコマンドを実行し、出力を確認します

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

また、各Pythonバージョンのフォルダー構成を表示するには、次のコマンドを実行します。

For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'

2
from sys import version_info, api_version, version, hexversion

print(f"sys.version: {version}")
print(f"sys.api_version: {api_version}")
print(f"sys.version_info: {version_info}")
print(f"sys.hexversion: {hexversion}")

出力

sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
sys.api_version: 1013
sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
sys.hexversion: 50726384

Python 2.7では、を使用する必要がありますprint("sys.version: {}".format(version))
マルコ

@マルコ、そうだね。文字列のフォーマットは、キーワード引数を使用してv 3+に対して行われます。Python 2.7の場合、print( '[{}、{}、{}]'。format(1,2,3))として実行できますref:stackoverflow.com/questions/517355/string-formatting-in-python
oetzi

1

sys.version_infotuple3.7の時点ではを返さないようです。むしろ、それは特別なクラスを返すので、少なくとも私にとって、タプルを使用するすべての例は機能しません。Pythonコンソールからの出力は次のとおりです。

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

私はそれを組み合わせて使用​​することで十分だsys.version_info.majorとわかりましたsys.version_info.minor。例えば、...

import sys
if sys.version_info.major > 3:
    print('Upgrade to Python 3')
    exit(1)

Python 3を実行しているかどうかを確認します。特定のバージョンを確認することもできます...

import sys
ver = sys.version_info
if ver.major > 2:
    if ver.major == 3 and ver.minor <= 4:
        print('Upgrade to Python 3.5')
        exit(1)

少なくともPython 3.5を実行しているかどうかを確認できます。


これはサブクラスのようなものでnamedtupleあり、タプルとの比較は確実に機能します。完全な同等性を得るには、メジャー、マイナー、マイクロ、リリースレベル(文字列)、シリアルの5要素のタイプルが必要です。
ミハイルエドシン

0

さらに簡単な方法:

Spyderで、新しい「IPythonコンソール」を起動し、既存のスクリプトを実行します。

これで、バージョンはコンソールウィンドウの最初の出力に表示されます。

"Python 3.7.3(デフォルト、Apr 24 2019、15:29:51)..."

ここに画像の説明を入力してください


0

コマンドラインから確認するには、1つのコマンドで、メジャー、マイナー、マイクロバージョン、リリースレベル、シリアルを含めます。

> python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"

3.7.6-final-0

注:.format()f-stringsの代わりに、または'.'.join()任意のフォーマットと区切り文字を使用できるようにします。私はこれをすべての重要なバージョンを報告するbashユーティリティスクリプトに入れました:python、numpy、pandas、sklearn、MacOS、xcode、clang、brew、conda、anaconda、gcc / g ++など。ロギング、複製、トラブルシューティング、バグ報告などに便利です。 。


-1

Linuxで作業している場合は、コマンドpython 出力を次のように指定します。

Python 2.4.3(2009年6月11日14:09:37)

[GCC 4.1.2 20080704(Red Hat 4.1.2-44)] on linux2

詳細については、「help」、「copyright」、「credits」、または「license」と入力してください。


5
私のpythonスクリプトがそれを解釈しているpythonのバージョンを取得できるようにしたいのですが。正解が受け入れられました。
運送業者

Pythonはスクリプト内でバージョンを取得するのに役立ちません。また、以前に投稿された同様の回答も含まれます。stackoverflow.com
a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.