22

Pythonスクリプトがpython3ではなくpython2によって解釈されることを確認する標準的な方法はありますか? 私のディストリビューションでは、 #!/usr/bin/env python2 をシバンとして使用できますが、すべてのディストリビューションが「python2」を出荷しているわけではないようです。Python の特定のバージョン (2.6 など) を明示的に呼び出すこともできますが、そのバージョンを持っていない人は除外されます。

ディストリビューションが python3 をデフォルトの python インタープリターとして配置し始めると、これはますます問題になると思われます。

4

8 に答える 8

11

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

sys モジュールを使用すると、実行中の python のバージョンを特定し、例外や終了などを発生させることができます。

アップデート:

これを使用して、適切なインタープリターを呼び出すことができます。たとえば、チェックを行う小さなスクリプトをセットアップし、それを shbang で使用します。実行中のpythonバージョンをチェックし、必要なものでない場合は、必要なものを探します。次に、そのバージョンの Python でスクリプトを実行します (または、適切なものが見つからない場合は失敗します)。

于 2010-08-27T17:42:36.647 に答える
8

これは、移行期間が非常に長くなるため、やや厄介な問題です。残念ながら、起動された Python スクリプト自体をチェックする以外に、どの Python バージョンが呼び出されているかを保証する確実なクロスプラットフォームの方法はありません。ほとんどではないにしても、Python 3 を出荷する多くのディストリビューションでは、ジェネリックpythonコマンドがデフォルトで最新の Python 2 バージョンにpython3エイリアス化され、最新の Python 3 にエイリアス化されます。そうでないディストリビューションでは、そうすることが推奨されます。ただし、ユーザーがそれをオーバーライドしないという保証はありません。python近い将来に利用できるベスト プラクティスは、パッケージャー、ディストリビューター、およびユーザーが Python 2 を参照していると想定し、必要に応じて実行時チェックをスクリプトに組み込むことだと思います。

于 2010-08-27T20:00:59.923 に答える
7

you を使用sys.version_infoすると、それに対して簡単な値テストを実行できます。たとえば、バージョン 2.6 以下のみをサポートする場合:

import sys
if sys.version_info > (2,6):
    sys.exit("Sorry, only we only support up to Python 2.6!")
于 2010-08-27T18:37:56.583 に答える
2

まったく同じ状況ではありませんが、私が働いている会社には、(多くの機能の中で) Python スクリプトを実行できるアプリがあります。さまざまなプラットフォームでの Python のインストールに関連する多数のサポートの問題の後、アプリと共に独自の Python インタープリターをインストールすることにしました。そうすれば、インストールされている場所とバージョンを正確に知ることができます。このアプローチは、ニーズに対して重すぎるかもしれません (Python パッケージは、アプリのビットの約 10% にすぎません) が、確実に機能します。

于 2010-08-27T20:11:25.293 に答える
2

配布方法にもよると思います。

通常のsetup.pyファイルを使用してディストリビューションを管理している場合、ユーザーが Python 3 にインストールしようとしている場合は、そのファイルを爆破させます。

インストールが完了すると、(たとえば) setuptools によって作成されたコンソール スクリプトのシバンは、インストールに使用された特定のインタープリターにリンクされる可能性があります。

インストールに奇妙なことをしている場合は、使用しているインストール スクリプトで Python インタープリターを探して、選択肢を保存することができます。最初に、「python」と呼ばれるものが 2.x であるかどうかを確認できます。そうでない場合は、「python2.7」、「python2.6」などをチェックして、利用可能なものを確認してください。

于 2010-08-27T20:22:06.523 に答える
0

私が理解しているように、さまざまなディストリビューションがドライブのさまざまな場所にあります。ここに思いつくいくつかの提案があります -

  1. UNIX エイリアスを使用して、さまざまなディストリビューションを指すショートカットを作成できます。例: エイリアス py2="/usr/bin/python2.X"。したがって、スクリプトを実行するときに py2 xx.py を使用できます
  2. または、他の方法で PYTHON_PATH 環境変数を変更することもできます。
  3. または、私が間違っていなければ、sysモジュールに現在のpythonバージョン番号を取得するための規定があります。あなたはそれを手に入れて適切に対処することができます。

これで済むはず…

于 2010-08-27T17:43:29.950 に答える
0

autotools を使用して、Python 2 インタープリターを選択できます。 これを行う方法は次のとおりです。正しいシバンを保証することは、エレガントに行うのが難しい場合があります。ここにそれを行う1つの方法があります。wrapper.sh.in次のような軽い Bash ラッパー スクリプトを使用する方が簡単な場合があります。

#!/bin/bash
PYTHON2="@PYTHON@" #That first link enables this autotool variable
"$PYTHON2" "$@"  #Call the desired Python 2 script with its arguments

wrapper.sh次のように(の後に./configure)呼び出します。

./wrapper.sh my_python2_script.py --an_option an_argument
于 2013-10-04T18:34:39.500 に答える
-1

これはあなたが望むこと、つまり3.x未満の非特定バージョンのPythonをテストすることになると思います(from __future__ import print_functionステートメントが含まれていない限り)。

try:
    py3 = eval('print')
except SyntaxError:
    py3 = False

if py3: exit('requires Python 2')
...

printPython3 のように、ステートメントではなく組み込み関数であるかどうかをテストすることで機能します。関数でない場合、eval()関数は例外を発生させます。これは、コードが上記の注意事項を備えた Python 3.0 より前のインタープリターで実行されていることを意味します。

于 2010-08-27T19:34:57.840 に答える