GNU/Linux >> Linux の 問題 >  >> Linux

shebang env 優先 python バージョン

#!/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 >>>
@@

Linux
  1. UbuntuとDebianでPythonバージョンを切り替える方法

  2. シバンの複数の議論?

  3. 古い/新しいバージョンのPythonを安全にインストールする方法は??

  1. なぜPython2.7はまだUbuntuのデフォルトのPythonバージョンなのですか?

  2. Tox は間違ったバージョンの pip を仮想環境にインストールします

  3. 別のバージョンの python で実行されている pytest

  1. Debian 9StretchLinuxでデフォルトのPythonバージョンを変更する方法

  2. Ubuntu 20.04および18.04にPythonをインストールするにはどうすればよいですか?

  3. Win-KeX バージョン 2.0