2008-09-02 6 views
12

環境。私は互換性のPythonのバージョンのマニュアルチェック持っているので、私のスクリプトはすぐに失敗します。私はそれが可能だ場合は、すべての実行可能ファイルにシェバング行を変更する必要がありますする必要はありませんPythonの展開とは/ usr/binに/ envを移植

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

を。しかし、私はenv pythonの結果を変更するには、マシンへの管理アクセス権を持っていないと私はのように、特定のバージョンを強制したくない:5月このため、システムを回避するために、私が好きな

#!/usr/bin/env python2.4 

Python 2.4よりも新しいバージョンを持っているか、Python 2.5を持っていてもPython 2.4はないかもしれません。

どのような洗練されたソリューションですか?

[編集:]私は質問を装っに十分な特異的ではなかった - 私は、ユーザーが手動設定せずにスクリプトを実行させたいのですが(例えばパス変更または~/binにシンボリックリンクし、あなたのPATHを確保することは、Pythonの前~/binを持っています2.2パス)。おそらく、いくつかの配布ユーティリティは、手動の微調整を防ぐために必要ですか?

答えて

8

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

2

スクリプトを実行しているなら、あなたは最初のプライベートbinディレクトリを指すようにPATH変数を設定することができます。

$ 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> 
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] 
+0

また、見つかった実行可能ファイルとsys.argvリストでos.execを使用することをお勧めします。 – tzot

0

@morais:これは興味深い考えですが、私たちはそれをさらに一歩先に進めることができます。たぶんそこへIan Bicking's virtualenvを使用する方法です:私たちはそもそも許容できる環境で実行しているかどうかを確認してください

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

virtualenvがこれに対応しているかどうかわかりません。すぐに間に合うでしょう。 :)

+0

Windowsの場合、記述するロジックのいくつかは、[PEP 397 Pythonランチャーfor Windows](http://www.python.org/dev/peps/pep-0397/)から入手できます。 –

0

あなたが(1)シバンを使って絶対に設定し、(2)あなたのビルドプロセスでオートツールを使うことができるなら、これは解決策です。

昨夜、autoconfマクロAM_PATH_PYTHONを使用して、最小のPython バイナリを見つけることができました。ハウツーはhereです。

だから、あなたのプロセスは次のようになります。

  • 特集あなたconfigure.ac
  • (私の経験では、これはviを混同しない).py.inにご.pyスクリプトのすべての名前を変更する名前でAM_PATH_PYTHON(2.4)AC_CONFIG_FILESを使用して生成するすべてのPythonスクリプト。
  • 代わりの#!/usr/bin/env pythonから始めて、次に、あなたの結果 Pythonスクリプトは、常に適切なシェバングを持つことになります#[email protected]@

を使用しています。

少なくとも現実的でない場合は、可能な限り、この解決方法があります。

関連する問題