3

私は、UNIXライクなさまざまなリリースで実行する必要のあるスクリプトを書いています。これらはpython2.xで書かれています。

残念ながら、一部の新しいリリースでは、このフレーバーバイナリを「python」ではなく「python2」と呼んでいます。したがって、「#!/ usr / bin / env python」は、適切にインストールされたpythonインタープリターを探すためには機能しません。バージョン3のインタプリタを入手するか(悪い)、インタプリタをまったく入手しない(悪い!)

インストールされている場合はpython2インタープリター、インストールされている場合はpythonインタープリターで読み込まれるようにpythonスクリプトを作成する賢い方法はありますか?「python」がpython3であるかどうかを検出するには、他のメカニズムを使用する必要がありますが、その時点でpythonのような環境にいるので、それを使用できます。

リップルランチャーを作成して「findpython2」と呼び、それを#として使用できると思います。スクリプトのインタプリタですが、これは検索パスにfindpython2をインストールする必要があることを意味します。これは明らかに最適ではありません(これらのスクリプトは絶対参照によって呼び出されることが多いため、パスには含まれていません)。

4

3 に答える 3

6

有名なperlハッシュバントリックからインスピレーションを得て、私はこれを思いついた:

#!/bin/sh
"""":
python2 -c "" 2>/dev/null && exec python2 $0 ${1+"$@"}
python  -c "" 2>/dev/null && exec python  $0 ${1+"$@"}
echo "Could not find a python interpreter."
exit 1
"""

print "hello python"
于 2012-09-26T17:53:04.230 に答える
4

UNIXの方法は、指定することです。ほとんどの優れたディストリビューションは、2.xasとpython23.xasをインストールし、メインのディストリビューションをリンクします(ほとんどのディストリビューションでは、2.x)。したがって、必要なものを明示的に指定することをお勧めします。python2python3python

これはすべてPEP394で定義されており、次のように述べられています。

このPEPは、Pythonインタープリターのデフォルトバージョン(つまり、pythonコマンドによって呼び出されるバージョン)に関係なく、Pythonスクリプトが*nixシステム間で引き続き移植可能であることを保証するための規則を提供します。

  • python2はPython2.xのいくつかのバージョンを参照します
  • python3はPython3.xのいくつかのバージョンを参照します
  • pythonはpython2と同じターゲットを参照する必要がありますが、一部の最先端のディストリビューションではpython3を参照する場合があります

したがって、ディストリビューションがこれを行っていない場合、それは本質的に彼らの側のバグです。

于 2012-09-26T16:34:57.777 に答える
0

で実行する必要がある場合はpython 2、インタプリタをとして呼び出すこともお勧めしますpython2。ほとんどのUNIXリリースには、適切なバイナリ/usr/bin/python/との間のシンボリックリンクがあると思います。/usr/bin/python2

于 2012-09-26T16:35:17.217 に答える