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

おすすめ記事