python == python2 OR python == python3?python py2kスクリプトをパッケージ化して配布する方法は?


10

システムに応じて、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 py2kディストリビューションにpython2ファイルが含まれていることを確認できます#!/usr/bin/env python2か?

はいの場合、なぜそれが標準として提案されていないのですか、たとえばpython py2kのドキュメントでは


4
私が知る限り、いつでもpython2それを実行するために使用できます(インストールされている場合)、常にでバージョンを確認できますpython -V。それpythonが2または3であることが必要な場合はrm /usr/bin/python、必要なPythonバージョンからポイントするシンボリックリンクを作成する必要がありますln -s /usr/bin/python2.5 /usr/bin/python
ハナンN.

について私を確保していただきありがとうございpython2ます。なぜpy2kとpy3kがあり、デフォルトpythonが異なる場合にそれを使用することが標準ではないのかと思います。削除についてのあなたのアドバイスはどうですか-それはこの例には適切ではありません、私はパッケージングについて尋ねます。異なる構成/システムで実行できるパッケージを作成したいのですが。環境を変更する方法はありません。チェックについては- 私が知る限り、それはシバンには適用されません-。
Grzegorz Wierzowiecki

@Hanan N.が伝えようとしているのは、Python 2.xコードを作成#!...python2している場合はプログラムで使用し、Python 3.xを使用している場合はを使用することだと思います#!...python3。特定のリリースでのみ機能することがわかっている場合は、オペレーティングシステムが正しいリンクを持っているとは限りません。私は、Python 1.5.2がまだインストールされているシステムを/usr/bin/python使用していますpython2。古いPythonリリースを処理するコードを書くか、使用します。
Arcege

2
@Arcege python2私のシステムには実行ファイルがありません(Debian squeeze)。pythonはへのシンボリックリンクpython2.6でありpython3、へのシンボリックリンクですがpython3.1、はありませんpython2
Gilles「SO-邪悪なことをやめなさい」

回答:


3

スクリプトはPythonのバージョンを確認できます。Python3の場合は、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


1

古いバージョンでは、python代わりにが存在する場合がありpython2ます。シーバンラインをより明確にするpython2 -> pythonために、を使用できるようにリンクを作成できます#!/usr/bin/env python2


ただし、記載されている問題は解決されません。問題は、それが言及した環境のすべてで実行できるように(「パイソン」「python2」などと)、あなたのスクリプトポータブル十分を作る方法であるので
グジェゴシWierzowiecki

1

「標準」はhttps://www.python.org/dev/peps/pep-0394/で定義されていると思います

このPEPは、Pythonインタープリターのデフォルトバージョン(つまり、pythonコマンドによって呼び出されるバージョン)に関係なく、Pythonスクリプトを* nixシステム間で引き続き移植できるようにするための規則を提供します。

  • python2は、Python 2.xの一部のバージョンを指します。
  • python3は、Python 3.xの一部のバージョンを指します。
  • 当面は、すべてのディストリビューションでpythonがpython2と同じターゲットを参照するようにする必要があります。
  • ただし、エンドユーザーはpythonが少なくともArch Linuxのpython3を参照していることを認識する必要があります(この変更により、このPEPの作成が促されました)。Pythonは、両方のPython 2とソース互換性のあるスクリプトに対してのみ、シバン行で使用する必要がありますおよび3。
  • Pythonのデフォルトバージョンの最終的な変更に備えて、Python 2のみのスクリプトは、Python 3とソース互換になるように更新するか、またはshebang行でpython2を使用する必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.