10

私はこの問題を抱えています:

System AUbuntuを実行Python 2.6し、さまざまなものが必要です。私はネイティブに個別
にインストールしました。Python 2.7System A
System BPython 2.7

一番上にあるpythonスクリプトBLAHがあります#!/bin/env python
さらに下では、別のスクリプトを実行しSIGHます#!/bin/env python

BLAHSystem Aまたはで実行するSystem B必要があり、常に実行する必要があるPython 2.7

----
これまでの私の解決策の一部:が Python 2.7 を指している
かどうかを最初に確認しようとするラッパー スクリプトを用意します。問題がなければ、そのpython のパスで 実行します。 それ以外の場合は、そのパスを使用して を実行し、そのパスを に追加します。which python
BLAH
which python2.7BLAHenv PATH

このソリューションの問題は次のとおりです。

On System A(Python 2.7 が別途インストールされている)実行すると、私が書いたラッパー スクリプトのおかげで Python 2.7 で実行されます (ここまで
は大丈夫 です.. )で python を探しており、パスで探しているはずです。BLAH
BLAHSIGHSIGHenvPATHpython2.7

この問題を処理するクリーンな方法はありますか?

前もって感謝します!

4

4 に答える 4

12

2.7 など、特定の Python バージョンを必要とするスクリプトがある場合は、最初の行を次のように変更します。

#!/bin/env python2.7

そして、それpython2.7がパス上にあることを確認します (必要に応じてシンボリック リンクを追加する必要がある場合があります)。私が使用したすべてのディストリビューションには、これらのシンボリック リンクが既に存在します。

(実際にpythonは、通常、へのシンボリックリンクであり、私の場合はpythonXへのシンボリックリンクです。)pythonX.Ypython -> python2 -> python2.7

フル パスはディストリビューションごと、またはボックスごとに異なる可能性があるため、ハードコードする必要はありません。

しかし、 というパス上の実行可能ファイルにはあいまいさがあってはならないので、パスpython2.7のハードコーディングについて心配する必要はありません。

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

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

それ以外の

subprocess.Popen([SCRIPT_NAME])

編集JF Sebastian がコメントで指摘しているように、最初の引数でsys.executableを使用して、2 番目のスクリプトが最初のスクリプトと同じインタープリターに渡されるようにすることができます。例えば

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

補足として、役立つ場合とそうでない場合がありますが、スクリプト内の「現在の」Python インタープリターのバージョンにアクセスするには、次のようにします。

import sys
print(sys.hexversion)

これは、正しいインタープリターが実行されているかどうかを判断するのに役立ちます。

于 2012-07-03T22:21:24.453 に答える
2

virtualenv を使用しないのはなぜですか? インストールされている任意のバージョンの Python を使用できます (他のものに加えて)...

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)
于 2012-07-03T22:41:36.747 に答える
2

私がすることは、最初に直接パスに変更すること#!/bin/envです。python2.7たとえば、#!/usr/local/bin/python2.7動作します。

システムAとBのpython2.7パスが異なる場所にある場合(これはあなたのケースのようです)、いつでも次のようなシンボリックリンクを作成できます:

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

そしてそれはうまくいくはずです。

于 2012-07-03T22:00:49.873 に答える
0

愚かで単純

シェルで、必要に応じて次のようにします。

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

Python スクリプトでは:

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

私はこの種の問題を経験してきましたが、このソリューションはほとんどのケースを解決し、あるシステムから別のシステムに簡単に移植できました (システム間の異なるパス、異なるバージョンのソフトウェアに直面する可能性があります...)。最初にシンボリック リンクを作成して、適切なバージョンの Python を確実に実行できるようにし (これは、Python3 が単なる Python の場合は実行できないため、特に当てはまります)、次に bash env に依存します。そのため、面倒なパッケージを必要としない util-script のシステムをターゲットにするたびに、スクリプトを変更する必要はありません。

于 2017-07-02T17:34:38.570 に答える