スクリプトを解釈しているPythonインタープリターのバージョンを確認するにはどうすればよいですか?
python_version = int(str(range(3))[-2])
スクリプトを解釈しているPythonインタープリターのバージョンを確認するにはどうすればよいですか?
python_version = int(str(range(3))[-2])
回答:
この情報は、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)
これにより、メジャーバージョン情報とマイナーバージョン情報が比較されます。(=マイクロ追加0
、1
(=、など)、さらにはreleaselevelを'alpha'
、'final'
好きなようにタプルに、など)。ただし、ほとんどの場合、特定の機能が存在するかどうかを「確認」することをお勧めします。存在しない場合は、回避策(または救済)を実行することをお勧めします。新しいリリースでは機能が廃止され、他の機能に置き換えられる場合があります。
PY3 = sys.version_info[0] == 3
sys.version_info
プロパティとしてアクセスすることもできるためPY3 = sys.version_info.major == 3
、もう少し魅力的かもしれません。
if sys.version_info >= (3,)
。異なるサイズのタプルを比較するのは完全にpythonicであり、正しいことを行います。
sys.hexversion
このようなものが好きです。
http://docs.python.org/library/sys.html#sys.hexversion
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
(2,6,4)
て'final'
も、比較に影響はないようで、そうではありません。タプルの「最も重要な」部分を比較するとき、明らかにスライスは必要ありません。これはそれがどのように扱われるかであり、それが私の質問に関するものです。このソリューションにメリットがないと言っているのではありません。なぜそれがベストなのか、つまり、何が足りないのか疑問に思っています。
あなたの最善の策はおそらくそのようなものです:
>>> 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!"
>>>
except Exception
広すぎます。あなたが期待する特定の例外を使う方が良いのではないでしょうか?
except Exception:
ライン自体は、すでに最新の(2.x +)Pythonを想定しています。たぶんいくつかの将来のpythonはいくつかの後方互換性のない方法で例外名を再配置しますか?(おそらくそうではありませんが、20年間にpythonがどのように見えるかは、オクルスリフトの眼球インプラントがある場合は誰が知っていますか?コードは長期間続きます。)
stdlib platform
のpython_version
を使用します。
>>> from platform import python_version
>>> print(python_version())
2.7.8
次のようなものを入れてください:
#!/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はスクリプトをロードすることさえできない場合があるため、このエラーを報告するのに十分ではないことに注意してください。回避策として、より新しいコードでスクリプトをインポートするスクリプトで上記を実行できます。
x if Pred() else y
。これらは「字句解析」フェーズで死に、実際に実行する 機会はありませんexit(1)
。 セスの答えは、新しい言語機能を他のファイルにカプセル化することにおいて正しいです。
else
ブランチまたはそのa <
が使用されていversion_info
ますか?AFAIK Pythonはタプルの欠損値を埋め込んでいますが、これはすべて2.6より前に有効であるはずです。違いますか?したがって、セスの回答ではスライシングが(冗長に)使用されていますが、スライシングでは使用されておらず、コメントがさらにわかりにくくなっています。
すぐに終了する短いコマンドラインバージョンを次に示します(スクリプトと自動実行に便利です)。
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)
python2 --version
でpython3 --version
、PHPの出力をキャプチャしてバージョン番号を取得していた問題が解決しました。私は後者を介して問題なく後者を取得passthru()
しますが、前者はファイルにリダイレクトされた場合でも、画面に印刷されるだけでキャプチャされません...
print()
より便利な場合は、ファイルに書き込むように指示できます。
passthru()
出力をファイルにリダイレクトしているのと同じです。あなたのソリューションは私が必要としていることを正確に行います。:)
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
いくつかの回答は、現在の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")
面白くするために、以下は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")
Pythonのバージョンを確認する:python -V
またはpython --version
またはapt-cache policy python
を実行whereis python
して、インストールされているバージョンの数を確認することもできます。
...リスト内包範囲の変更を(ab)使用して、単一の式でそれを行うことができます:
is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
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
print("sys.version: {}".format(version))
。
sys.version_info
tuple
3.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要素のタイプルが必要です。
コマンドラインから確認するには、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 ++など。ロギング、複製、トラブルシューティング、バグ報告などに便利です。 。
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」と入力してください。
Python
はスクリプト内でバージョンを取得するのに役立ちません。また、以前に投稿された同様の回答も含まれます。stackoverflow.com