システムによっては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
コマンドを使用します。その後、再起動されます(見つからない場合は中止されます)。python2
PATH
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を使用する必要があります。