13

実行可能なすべての Python スクリプトの先頭に、次のようなシバン行を追加しました。

#!/usr/bin/env python

env pythonPython 2.2 環境を生成するシステムでこれらのスクリプトを実行しています。互換性のある Python バージョンを手動でチェックしているため、スクリプトはすぐに失敗します。

if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

可能であれば、実行可能ファイルごとにシバン行を変更する必要はありません。ただし、結果を変更するためのマシンへの管理アクセス権がなく、次のenv pythonように特定のバージョンを強制したくありません。

#!/usr/bin/env python2.4

システムに Python 2.4 よりも新しいバージョンがあるか、Python 2.5 はあるが Python 2.4 がない可能性があるため、これは避けたいと思います。

エレガントなソリューションは何ですか?

[編集:] 私は質問を提起する際に十分に具体的ではありませんでした -- ユーザーが手動で構成せずにスクリプトを実行できるようにしたいと思います (たとえば、パスの変更またはシンボリックリンクを作成し~/bin、PATH が~/binPython 2.2 パスの前にあることを確認します)。手動での微調整を防ぐために、何らかの配布ユーティリティが必要になるのでしょうか?

4

5 に答える 5

8

「env」は、PATH 環境変数で最初に見つかったものを単純に実行します。別の python に切り替えるには、スクリプトを呼び出す前に、その python の実行可能ファイルのディレクトリをパスに追加します。

于 2008-09-02T21:25:40.520 に答える
4

かなりハックな解決策 - チェックが失敗した場合は、この関数 (おそらく大幅に改善される可能性があります) を使用して、利用可能な最適なインタープリターを判断し、それが受け入れられるかどうかを判断し、受け入れられる場合は、os.system または同様のものと sys でスクリプトを再起動します。新しいインタープリターを使用した argv。

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]
于 2008-09-03T20:32:40.217 に答える
2

スクリプトを実行している場合は、PATH 変数を最初にプライベート bin ディレクトリを指すように設定できます。

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

次に、Python スクリプトを実行すると、Python 2.4 が使用されます。PATH を変更するには、ログイン スクリプトを変更する必要があります。

または、必要な明示的なインタープリターを使用して Python スクリプトを実行します。

$ /path/to/python2.4 <your script>
于 2008-09-02T21:28:03.320 に答える
0

@morais: それは興味深いアイデアですが、さらに一歩先を行くことができると思います。おそらく、Ian Bicking の virtualenvを使用して次のことを行う方法があります。

  • まず、受け入れ可能な環境で実行しているかどうかを確認し、そうであれば何もしません。
  • にバージョン固有の実行可能ファイルが存在するPATHかどうかを確認します。つまり、python2.x存在するかどうかを確認しますfor x in reverse(range(4, 10))。その場合は、より適切なインタープリターでコマンドを再実行してください。
  • より適切なインタープリターが存在しない場合は、virtualenv を使用して、古いバージョンの Python から新しいバージョンの Python を試してインストールし、必要なパッケージを取得します。

virtualenv がこれに対応しているかどうかはわかりません。:)

于 2008-09-03T23:07:53.430 に答える