2012-07-03 11 views
8

#を使用する必要があるときに私はこの問題を持っている複数のpythonのバージョンに対処します。
System A
System BがネイティブにPython 2.7にインストールされています。
はPythonのファイルは、/ binに/のenv pythonの

#!/bin/env pythonと言っているpythonスクリプトBLAHがあります。
さらに別のスクリプトSIGHを実行します。上にも#!/bin/env pythonと表示されます。

BLAHSystem AまたはSystem Bのいずれかで実行する必要があり、それは常に、これまで私の解決策のPython 2.7

----
パートを実行する必要があります:
に最初に表示しようとするラッパースクリプトを持っていますもしwhich pythonがPython 2.7を指しているのならば
これであれば、そのパスにpythonのBLAHを実行してください。
さらにwhich python2.7を試してそのパスを使用してBLAHを実行し、そのパスをenv PATHに追加します。

この解決策の問題がある:System A

(別途インストールのPython 2.7を有する)
BLAHが実行されると、それはので、私は今のところ大丈夫(書いたラッパースクリプトのPythonの2.7で実行されます。.. )
BLAHSIGHを生成します場合は、SIGHは、パスでのpythonを見つけるために、シェバングを使用し、それがenvさんPATHでのpythonを探していると、それがパスにpython2.7を探してしなければならないので、それがトラブルにあります。

この問題をきれいに処理する方法はありますか?

ありがとうございます!

+0

BLAHからSIGHをインポートして実行できますか? –

+0

''〜から取得したパスを '' PATH' - '' '' '' PATH''に含まれているパスだけを実際に検索するように追加する必要はないと思います。 – jedwards

答えて

9

あなたが特定のPythonのバージョンを必要とするスクリプトを持っている場合は、たとえば2.7のために、私は

#!/bin/env python2.7 

に最初の行を変更してpython2.7がパス上にあることを確認したいあなたは追加する必要があります(適切なシンボリックリンク)。私が使ったすべてのディストリビューションでは、これらのシンボリックリンクはすでに存在しています。

(実際には、pythonは、私の場合には、python -> python2 -> python2.7pythonX.YへのシンボリックリンクがあるかpythonXへのシンボリックリンクは、一般的である。)

完全なパスをハードコードする必要はありませんが、これは異なる可能性があるため、ありません

ディストリビューションまたはボックスからボックスへのディストリビューション。

しかし、python2.7という名前のパス上の実行ファイルにはあいまいさがないので、ハードコーディングのパスを気にする必要はありません。

また、最初のスクリプト内から、あなたはのように、直接Pythonのインタプリタを呼び出すことができます。

subprocess.Popen(['pythonX.Y', SCRIPT_NAME]) 

代わり

subprocess.Popen([SCRIPT_NAME]) 

EDITのJFセバスチャンはコメントで指摘したよう、最初の引数にsys.executableを使用して、2番目のスクリプトが最初と同じインタプリタに渡されたことを確認できます。かないかもしれない有用であるかもしれない、あなたは

有用である可能性が
import sys 
print(sys.hexversion) 

によってスクリプトの内側に「現在」のPythonインタプリタのバージョンにアクセスすることができますサイドノートとして、例えば

subprocess.Popen([sys.executable, SCRIPT_NAME]) 

正しいインタープリターが実行されているかどうかを判断します。

+0

@jedwards特定のシバンが働いていない、Apacheの無効なパスエラーを取得中 – Volatil3

3

まず、#!/bin/envpython2.7のパスに直接変更します(例:#!/usr/local/bin/python2.7)。

ln -s /bin/python2.7 /usr/local/bin/python2.7 

、それだけで正常に動作する必要があります:ケースシステムAとBのpython2.7パスで

あなたは常にこのようなシンボリックリンクを作成することができます(あなたのケースのようです)別の場所にあります。

2

なぜvirtualenvを使用しませんか?必要な場合は、シェルで

starenka /tmp % virtualenv test -ppython2.6 
Running virtualenv with interpreter /usr/bin/python2.6 
New python executable in test/bin/python2.6 
Also creating executable in test/bin/python 
Installing setuptools............................done. 
Installing pip...............done. 

starenka /tmp % source test/bin/activate 

(test)starenka /tmp % which python 
/tmp/test/bin/python 

(test)starenka /tmp % python --version 
Python 2.6.8 

(test)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test/test.py 

(test)starenka /tmp % chmod +x test/test.py 

(test)starenka /tmp % test/test.py 
(2, 6, 8, 'final', 0) 

starenka /tmp % virtualenv test7 -ppython2.7 
Running virtualenv with interpreter /usr/bin/python2.7 
New python executable in test7/bin/python2.7 
Also creating executable in test7/bin/python 
Installing setuptools............done. 
Installing pip...............done. 
starenka /tmp % source test7/bin/activate 

(test7)starenka /tmp % which python 
/tmp/test7/bin/python 

(test7)starenka /tmp % python --version 
Python 2.7.3rc2 

(test7)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test7/test.py 

(test7)starenka /tmp % chmod +x test7/test.py 

(test7)starenka /tmp % test7/test.py 
sys.version_info(major=2, minor=7, micro=3, releaselevel='candidate', serial=2) 
0

愚かな、シンプルな

...あなたは(他のもののほかに)インストールされているすべてのPythonのバージョンを使用することができます:

ln -s /path/to/your/python2.X /usr/local/bin/python2 

Pythonではスクリプト:

#!/bin/bash 
"exec" "python2" "$0" 

私はこの種のプロこのソリューションはほとんどのケースを解決し、あるシステムから別のシステムに簡単に移植できました(システム間、ソフトウェアのさまざまなバージョン...)。最初にPythonの適切なバージョンを実行するためのシンボリックリンクを作成します(これは特にPython3が単なるPythonの場合は今ではないことです)。そして、bashのenvに依存してください。したがって、パッケージの手間を必要としないutil-scriptのシステムをターゲットにするたびに、スクリプトを変更する必要はありません。

関連する問題