#!/bin/sh
''''which python2 >/dev/null 2>&1 && exec python2 "$0" "[email protected]" # '''
''''which python >/dev/null 2>&1 && exec python "$0" "[email protected]" # '''
''''exec echo "Error: I can't find python anywhere" # '''
import sys
print sys.argv
これは、最初にシェル スクリプトとして実行されます。 ''''
の間にほとんどすべてのシェル コードを配置できます。 と # '''
.このようなコードは、シェルによって実行されます。次に、python がファイルに対して実行されると、python はそれらの行を無視します。これは、それらの行が python にとって三重引用符で囲まれた文字列のように見えるためです。
シェル スクリプトは、which python2 >/dev/null
のパスにバイナリが存在するかどうかをテストします。 そうであればそれを実行します(すべての引数を適切な場所に配置して)。詳細については、シバン #!/bin/sh と exec python を 4 つの単一引用符で囲んだこのスニペットが機能するのはなぜですか?
注:行は 4 つの '
で始まります 4 番目の '
の間にスペースを入れてはいけません およびシェルコマンドの開始 (which
...)
このようなもの:
#!/usr/bin/env python
import sys
import os
if sys.version_info >= (3, 0):
os.execvp("python2.7", ["python2.7", __file__])
os.execvp("python2.6", ["python2.6", __file__])
os.execvp("python2", ["python2", __file__])
print ("No sutable version of Python found")
exit(2)
更新 以下は、同じもののより堅牢なバージョンです。
#!/bin/bash
ok=bad
for pyth in python python2.7 python2.6 python2; do
pypath=$(type -P $pyth)
if [[ -x $pypath ]] ; then
ok=$(
$pyth <<@@
import sys
if sys.version_info < (3, 0):
print ("ok")
else:
print("bad")
@@
)
if [[ $ok == ok ]] ; then
break
fi
fi
done
if [[ $ok != ok ]]; then
echo "Could not find suitable python version"
exit 2
fi
$pyth <<@@
<<< your python script goes here >>>
@@