さまざまな環境(およびPATH)を持ち、さまざまなLinuxシステムでさまざまなユーザーが理論的に実行できるPythonスクリプトがあるという興味深い状況に少しあります。このスクリプトは、人為的な制限なしにこれらの可能な限り多くで実行できるようにします。既知のセットアップを次に示します。
- Python 2.6はシステムのPythonバージョンであるため、python、python2、およびpython2.6はすべて/ usr / binに存在します(同等です)。
- Python 2.6は上記のシステムPythonバージョンですが、Python 2.7はpython2.7としてインストールされます。
- Python 2.4はシステムのPythonバージョンであり、私のスクリプトではサポートされていません。/ usr / binには、同等のpython、python2、python2.4、およびスクリプトがサポートするpython2.5があります。
これら3つすべてで同じ実行可能なPythonスクリプトを実行したいと思います。最初に/usr/bin/python2.7を使用し、存在する場合は、/ usr / bin / python2.6にフォールバックし、次に/usr/bin/python2.5にフォールバックしてから、それらのどれも存在しなかった場合、単にエラーになります。ただし、可能な場合は正しいインタープリターの1つを見つけることができる限り、可能な限り最新の2.xを使用してハングアップしません。
私の最初の傾向は、シェバンラインを次のように変更することでした。
#!/usr/bin/python
に
#!/usr/bin/python2.[5-7]
これはbashで正常に機能するためです。ただし、スクリプトを実行すると次のことができます。
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory
さて、bashでも機能する次のことを試してみてください:
#!/bin/bash -c /usr/bin/python2.[5-7]
しかし、再び、これは失敗します:
/bin/bash: - : invalid option
もちろん、正しいインタープリターを見つけて、見つかったインタープリターを使用してpythonスクリプトを実行する別のシェルスクリプトを作成することもできます。最新のpython 2インタープリターをインストールして実行する限り、1つで十分な2つのファイルを配布するのは面倒です。インタプリタを明示的に呼び出す(たとえば、$ python2.5 script.py
)ように人々に依頼することは選択肢ではありません。特定の方法で設定されているユーザーのPATHに依存することもオプションではありません。
編集:
Python 2.6の時点で存在する(with with 2.5で使用できる)"with"ステートメントを使用しているため、Pythonスクリプト内のバージョンチェックは機能しませんfrom __future__ import with_statement
。これにより、スクリプトはユーザーフレンドリーでないSyntaxErrorですぐに失敗し、最初にバージョンをチェックして適切なエラーを出力する機会を得ることができなくなります。
例:(2.6未満のPythonインタープリターでこれを試してください)
#!/usr/bin/env python
import sys
print "You'll never see this!"
sys.exit()
with open('/dev/null', 'w') as out:
out.write('something')
./script.py
)3番目の状況では、python2.4がスクリプトを実行し、コードが間違ったバージョンであることを検出します(おそらく終了します)。しかし、代わりにインタープリターとして使用できた、完全に優れたpython2.5があります!
exec
はエラーを出力します。
execve
)です。引数は文字列リテラルであり、グロビングも正規表現もありません。それでおしまい。最初の引数が「/ bin / bash」で、2番目のオプション(「-c ...」)であっても、これらのオプションはシェルによって解析されません。これらはbash実行可能ファイルに未処理のまま渡されるため、これらのエラーが発生します。さらに、シバンは最初の段階でのみ機能します。あなたはここで運が悪いので、私は怖いです(pythonインタープリターを見つけて、それをここでdocにフィードするスクリプトが不足しています)。
import sys; sys.version_info()
、ユーザーが必要なPythonバージョンを持っているかどうかを確認するために使用できます。