python == python2またはpython == python3? Python py2kスクリプトをパッケージ化してデプロイする方法は?

python == python2またはpython == python3? Python py2kスクリプトをパッケージ化してデプロイする方法は?

システムによってはpython==python2またはpython==ですpython3

次に始まる実行可能なPythonスクリプト:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Python py3kの場合:バージョン番号と一緒に使用する必要があるか使用可能であることが文書に記載されています。だから私はそうします:

#!/usr/bin/env python3

しかし、py2kスクリプトで何かが間違っていることがわかりました。

そしてpy2kドキュメント以下を使用するように書かれています#! /usr/bin/env python

一部の *nix-es では python py3k がデフォルトなので、 python==python3 です。 (例えばArchLinux Pythonパッケージ、ここPythonパッケージファイル)。

これを処理するために、配布用のPythonスクリプトをどのようにパッケージ化(構成、作成)および/または準備しますか?

ユーザーが(環境を変更せずに)簡単に実行できるパッケージを作成するように求められます。

python py3kスクリプトで行ったように、python py2kスクリプトでも同じトリックを実行し、次のように設定できますか#!/usr/bin/env python2?すべてのPythonディストリビューションにpy2kpython2ファイルが含まれていると確信していますが、#!/usr/bin/env python2これはうまくいきますか?

では、標準として推奨されないのはなぜですか?Python py2kドキュメント

答え1

スクリプトはPythonのバージョンを確認し、Python 3の場合はPython 2で再起動できます。スクリプトヘッドの近くに以下を追加します。

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

これは環境でシステムwhichコマンドを使用します。その後、再起動されます(見つからない場合は中止されます)。python2PATH

Python 3で実行するには、スクリプトが有効なPython 3構文である必要があります。

また、を呼び出す前にすべての出力をフラッシュする必要がありますexecv。それ以外の場合は失われます。たとえば、sys.stdout.flush()呼び出す前に追加すると、execvすべてのステートメントが更新されますprint

答え2

以前のバージョンでは代わりに機能することがあります。pythonシートpython2タングラインをより明確にするには。python2 -> python#!/usr/bin/env python2

答え3

私が考える「標準」の定義は次のとおりです。https://www.python.org/dev/peps/pep-0394/

この PEP は、Python インタプリタの基本バージョン(つまり、python コマンドで呼び出されるバージョン)に関係なく、Python スクリプトが *nix システムで移植可能であることを保証するルールを提供します。

  • python2はPython 2.xのバージョンを表します。
  • python3はPython 3.xのいくつかのバージョンを参照しています。
  • 現在、すべてのディストリビューションでは、pythonがpython2と同じターゲットを参照していることを確認する必要があります。
  • しかし、エンドユーザーは、少なくともArch Linuxでは、Pythonはpython3(このPEPの作成を引き起こした変更)を参照していることに注意する必要があります。したがって、PythonはPython 2とソース互換性のあるスクリプトのshebang行にのみ使用する必要があります。三。
  • Pythonの基本バージョンの最終変更に備えて、Python 2専用スクリプトはPython 3ソースと互換性があるように更新するか、shebang行でpython2を使用する必要があります。

関連情報