新しい言語機能を使用するプログラムでPythonバージョンを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/446052

  •  22-07-2019
  •  | 
  •  

質問

少なくとも特定のものを必要とするPythonスクリプトがある場合 Pythonのバージョン、正常に失敗する正しい方法は何ですか 以前のバージョンのPythonを使用してスクリプトを起動した場合

エラーメッセージを発行するのに十分早く制御する方法 終了しますか

たとえば、ternery演算子(2.5の新機能)と&with; with"を使用するプログラムがあります。ブロック (2.6の新機能)。シンプルな小さなインタープリター版を書きました スクリプトが最初に行うチェッカールーチン 呼び出します...ただし、そこまでは到達しません。代わりに、 私のルーチンの前に、Pythonのコンパイル中にスクリプトが失敗する とさえ呼ばれます。したがって、スクリプトのユーザーは、 あいまいなsynaxエラートレースバック-ほとんどが必要です 単に実行する場合であると推測する専門家 間違ったバージョンのPython。

Pythonのバージョンを確認する方法を知っています。問題は、古いバージョンのPythonでは一部の構文が違法であることです。このプログラムを検討してください:

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

2.4で実行する場合、この結果が必要です

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

この結果ではなく:

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(同僚のチャネリング。)

役に立ちましたか?

解決

eval を使用してテストできます:

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

また、 with はPython 2.5で使用できます。単に _future__ import with_statement から追加してください。

編集:十分に早く制御を取得するには、異なる .py ファイルに分割し、インポートする前にメインファイルの互換性を確認します(例: __ init __。py パッケージ):

# __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *

他のヒント

次の処理を行うプログラムのラッパーを用意します。

import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

2.0より前のPythonインタープリターを使用している人に出会う予定がある場合は、 sys.version()の使用を検討することもできますが、その場合は正規表現が必要になります。

そして、これを行うよりエレガントな方法があるかもしれません。

試す

import platform
platform.python_version()

&quot; 2.3.1&quot;のような文字列を提供する必要があります。これが正確ではない場合は、「プラットフォーム」を通じて豊富なデータセットを利用できます。組み入れる。あなたが望むものはどこかにあるべきです。

おそらく、このバージョン比較を行う最良の方法は、 sys.hexversion を使用することです。バージョンタプルを比較しても、すべてのPythonバージョンで目的の結果が得られないため、これは重要です。

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"
import sys    
# prints whether python is version 3 or not
python_version = sys.version_info.major
if python_version == 3:
    print("is python 3")
else:
    print("not python 3")
  

AskUbuntu でのNykakinからの回答:

標準ライブラリの platform モジュールを使用して、コード自体からPythonバージョンを確認することもできます。

2つの関数があります:

  • platform.python_version()(文字列を返します)。
  • platform.python_version_tuple()(タプルを返します)。

Pythonコード

  

たとえば、 version.py )のファイルを作成します

バージョンを確認する簡単な方法:

import platform

print(platform.python_version())
print(platform.python_version_tuple())

eval メソッドも使用できます:

try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

コマンドラインでPythonファイルを実行します:

$ python version.py 
2.7.11
('2', '7', '11')

Windows 10上のWAMPサーバーを介したCGIを使用したPythonの出力:

スクリーンショット2016-11-16 14.39.01 by Suriyaa Kudo


役立つリソース

セットは、後方互換性を保つために、Python 2.4のコア言語の一部になりました。当時私はこれを行いましたが、これはあなたにも役立ちます:

if sys.version_info < (2, 4):
    from sets import Set as set

質問は: エラーメッセージを発行するのに十分な早さで制御を取得する方法終了

私が答える質問は: アプリを起動する前にエラーメッセージを発行するのに十分な早さで制御を取得する方法

他の投稿とは異なる方法で回答できます。 これまでの回答は、Python内からあなたの質問を解決しようとしているようです。

言うには、Pythonを起動する前にバージョンチェックを行います。あなたのパスはLinuxまたはunixです。 ただし、Windowsスクリプトのみを提供できます。 Linuxのスクリプト構文に適応させるのはそれほど難しくないでしょう。

バージョン2.7のDOSスクリプトは次のとおりです。

@ECHO OFF
REM see http://ss64.com/nt/for_f.html
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
IF NOT ErrorLevel 1 GOTO Python27
ECHO must use python2.7 or greater
GOTO EOF
:Python27
python.exe tern.py
GOTO EOF
:EOF

これは、アプリケーションのどの部分も実行しないため、Python例外は発生しません。一時ファイルは作成されず、OS環境変数も追加されません。また、バージョン構文規則が異なるため、アプリが例外で終了することはありません。これは、アクセスポイントのセキュリティポイントが3つ少ないことです。

FOR / F 行がキーです。

FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul

複数のpythonバージョンをチェックするには、URLをチェックアウトします。 http://www.fpschultze.de/modules/smartfaq/faq。 php?faqid = 17

そして私のハックバージョン:

[MSスクリプト; PythonバージョンチェックPythonモジュールの事前起動] http://pastebin.com/aAuJ91FQ

import sys
sys.version

このような回答が得られます

  

'2.7.6(デフォルト、2016年10月26日、20:30:19)\ n [GCC 4.8.4]'

ここ 2.7.6 はバージョンです

上記のように、構文エラーは実行時ではなくコンパイル時に発生します。 Pythonは「解釈言語」ですが、Pythonコードは実際には直接解釈されません。バイトコードにコンパイルされ、解釈されます。モジュールがインポートされたときに(.pycまたは.pydファイルの形式で使用可能なコンパイル済みバージョンが存在しない場合)発生するコンパイルステップがあります。コードが実行されています。

上記のようにevalを使用することにより、必要に応じて、実行時に1行のコードに対してコンパイルステップを延期し、実行することができますが、個人的には、Python不必要に実行時コンパイルを実行するために、あることと別のことのために、それは私にとってコードが乱雑に感じられるものを作成します。 (必要に応じて、コードを生成するコードを生成するコードを生成できます-そして、これから6か月以内に絶対に素晴らしい時間を変更してデバッグします。)そのため、代わりに次のようなものをお勧めします。

import sys
if sys.hexversion < 0x02060000:
    from my_module_2_5 import thisFunc, thatFunc, theOtherFunc
else:
    from my_module import thisFunc, thatFunc, theOtherFunc

..新しい構文を使用する関数が1つしかなく、それが非常に短い場合でも、これを実行します。 (実際、このような関数の数とサイズを最小化するためにあらゆる合理的な手段を講じます。ifTrueAElseB(cond、a、b)のような関数に、その1行の構文を記述します。)

指摘する価値があるかもしれないもう1つのこと(まだ誰も指摘していないことに少し驚いています)は、Pythonの以前のバージョンは次のようなコードをサポートしていませんでした

value = 'yes' if MyVarIsTrue else 'no'

.. itは次のようなコードをサポートしていました

value = MyVarIsTrue and 'yes' or 'no'

それは三項式を書く古い方法でした。私はまだPython 3をインストールしていませんが、私が知る限り、それは「古い」ものです。方法は今でも機能するため、古いバージョンのPythonの使用をサポートする必要がある場合は、新しい構文を条件付きで使用する価値があるかどうかを自分で決めることができます。

ファイルの最上部に以下を追加します。

import sys

if float(sys.version.split()[0][:3]) < 2.7:
    print "Python 2.7 or higher required to run this code, " + sys.version.split()[0] + " detected, exiting."
    exit(1)

次に、通常のPythonコードを続行します。

import ...
import ...
other code...

最善の方法は、バージョンではなく機能をテストすることだと思います。場合によっては、これは些細なことですが、他の場合にはそうではありません。

eg:

try :
    # Do stuff
except : # Features weren't found.
    # Do stuff for older versions.

try / exceptブロックの使用について十分に具体的であれば、ほとんどのベースをカバーできます。

問題を自分で解決しようとしている最中に簡単な検索を行ったところ、この質問を見つけました。上記のいくつかの提案に基づいたハイブリッドを思いつきました。

ラッパースクリプトを使用するというDevPlayerのアイデアは好きですが、欠点は異なるOSに対して複数のラッパーを維持することになるため、Pythonでラッパーを作成することを決めましたが、同じ基本的な&quot;を実行してバージョンを取得するexe&quot;ロジックとこれを思いついた。

2.5以降で動作するはずです。 Linuxの2.66、2.7.0、3.1.2、OS Xの2.6.1でテストしました。

import sys, subprocess
args = [sys.executable,"--version"]

output, error = subprocess.Popen(args ,stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
print("The version is: '%s'"  %error.decode(sys.stdout.encoding).strip("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLMNBVCXZ,.+ \n") )

はい、最終的なデコード/ストリップ行が恐ろしいことはわかっていますが、バージョン番号をすばやく取得したかっただけです。これを改良します。

これは今のところ私にとっては十分に機能しますが、誰かがそれを改善することができれば(またはなぜそれが恐ろしいアイデアであるかを教えてください)、それもクールです。

スタンドアロン pythonスクリプトの場合、pythonバージョン(ここではv2.7.x)を強制する次のモジュールdocstringトリックが機能します(* nixでテスト済み)。

#!/bin/sh
''''python -V 2>&1 | grep -q 2.7 && exec python -u -- "<*>" ${1+"$@"}; echo "python 2.7.x missing"; exit 1 # '''

import sys
[...]

これは、欠落しているpython実行可能ファイルも処理する必要がありますが、grepに依存しています。 ここの背景。

sys.hexversion または sys.version_info で確認できます。

sys.hexversion は16進数であるため、人に優しいとは言えません。 sys.version_info はタプルなので、より人間に優しいです。

sys.hexversion でPython 3.6以降を確認します:

import sys, time
if sys.hexversion < 0x30600F0:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

sys.version_info でPython 3.6以降を確認します:

import sys, time
if sys.version_info[0] < 3 and sys.version_info[1] < 6:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

sys.version_info はより人間に優しいですが、より多くの文字が必要です。 sys.hexversion をお勧めしますが、人間に優しいとは言えません。

これがお役に立てば幸いです!

私はakhanの優れた回答を拡張しています。Pythonスクリプトがコンパイルされる前に 有用なメッセージを出力します。

スクリプトがPython 3.6以降で実行されていることを確認する場合は、次の2行をPythonスクリプトの先頭に追加します。

#!/bin/sh
''''python3 -c 'import sys; sys.exit(sys.version_info < (3, 6))' && exec python3 -u -- "
This script requires Python 3.6 or newer.
" ${1+"$@"}; echo 'This script requires Python 3.6 or newer.'; exit 1 # '''

(注:2行目は four シングルクォートで始まり、 3 シングルクォートで終わります。これは奇妙に見えるかもしれませんが、タイプミスではありません。)

このソリューションの利点は、 print(f'Hello、{name}! ')のようなコードは、Pythonバージョンが古い場合に SyntaxError を引き起こさないことです。 3.6が使用されます。代わりに次の役立つメッセージが表示されます。

<*>

もちろん、このソリューションはUnixライクなシェルでのみ機能し、スクリプトが直接呼び出された場合( ./ script.py など)、適切なeXecute許可ビットが設定されている場合のみ。

これについてはどうですか:

import sys

def testPyVer(reqver):
  if float(sys.version[:3]) >= reqver:
    return 1
  else:
    return 0

#blah blah blah, more code

if testPyVer(3.0) == 1:
  #do stuff
else:
  #print python requirement, exit statement

問題は非常に単純です。バージョンが 未満 2.4であり、 以上 ではないことを確認しました。したがって、Pythonバージョンが2.4であれば、2.4以上になります。 あなたが持っていたはずだったものは次のとおりでした:

    if sys.version_info **<=** (2, 4):

ではなく

    if sys.version_info < (2, 4):
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top