Python のデプロイメントと /usr/bin/env の移植性
-
09-06-2019 - |
質問
すべての実行可能な Python スクリプトの先頭に、 シバン ライン:
#!/usr/bin/env python
これらのスクリプトをシステム上で実行しています。 env python
Python 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 が ~/bin
Python 2.2 パスの前)。おそらく、手動調整を防ぐために何らかの配布ユーティリティが必要なのでしょうか?
解決
「env」は単に PATH 環境変数で最初に見つかったものを実行します。別の Python に切り替えるには、スクリプトを呼び出す前に、その Python の実行可能ファイルのディレクトリをパスの先頭に追加します。
他のヒント
かなりハック的な解決策 - チェックが失敗した場合は、この関数 (おそらく大幅に改善される可能性があります) を使用して、利用可能な最良のインタープリターを決定し、それが許容できるかどうかを判断し、許容できる場合は、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]
スクリプトを実行している場合は、最初にプライベート 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>
@モライス:興味深いアイデアですが、さらに一歩進めてもよいのではないかと思います。もしかしたら使い方もあるかもしれない Ian Bicking の virtualenv に:
- そもそも許容できる環境で実行しているかどうかを確認し、許容できる環境であれば何もしません。
- バージョン固有の実行可能ファイルが存在するかどうかを確認します。
PATH
, 、つまりどうかを確認してくださいpython2.x
存在しますfor x in reverse(range(4, 10))
. 。その場合は、より適切なインタープリタを使用してコマンドを再実行します。 - より適切なインタープリターが存在しない場合は、virtualenv を使用して、古いバージョンの Python から新しいバージョンの Python をインストールし、前提条件パッケージを取得します。
virtualenv でこれができるかどうかはわかりませんので、近いうちに試してみることにします。:)
(1) シバンを使用することに完全に決まっており、(2) ビルド プロセスで Autotools を使用できる場合の解決策は次のとおりです。
昨夜、autoconf マクロが使えることを知りました。 AM_PATH_PYTHON
最小限の Python を見つけるには 2 バイナリ。やり方は、 ここ.
したがって、プロセスは次のようになります。
- を発行します
AM_PATH_PYTHON(2.4)
あなたの中でconfigure.ac
- すべての名前を変更します
.py
スクリプトを.py.in
(私の経験では、これは混乱しませんvi
) - 生成するすべての Python スクリプトに名前を付けます
AC_CONFIG_FILES
. - から始めるのではなく
#!/usr/bin/env python
, 、 使用#!@PYTHON@
それからあなたの 結果として生じる Python スクリプトには常に適切なシバンが含まれます。
したがって、実用的ではないにしても、少なくとも可能性のあるこの解決策があります。