6

私は何千ものサーバー(Linux)を持っています.Python 2.xしかないものもあれば、Python 3.xしかないものもあります.1つのスクリプトを書きたい. python check.py または $python3 check.py、これを行う方法はありますか?

私の質問は、インタープリターが python2.x と python3.x であっても、スクリプト check.py がインタープリターを見つける方法です。

4

3 に答える 3

14

多くのスクリプトは、2.xと3.xの両方で実行できます。(私は毎日作業しているものがたくさんあり、さまざまなオープンソースライブラリを2.xのみからデュアルバージョンに変換しました。)

いくつかのことがそれをはるかに簡単にします:

  • 2.xユーザーには、2.7、または少なくとも2.6以上が必要です。そうしないと、たとえば、パラメータを使用して例外を発生させたり、それらを変数にキャッチしたりすることはできません。
  • 3.xユーザーには、3.3以上、または少なくとも3.2以上が必要です。不必要な非互換性のほとんど(uプレフィックスが削除されるなど)は、3.2または3.3で逆転しました。
  • 6つのライブラリを使用します。
  • __future__ステートメントを使用します。
  • bytes(常に8ビット)、unicode(8ビットが必要な場合はエンコードする必要がある)、またはstr(ほとんどのstdlib APIが期待するもの)、そしてencode必要decodeに応じて、頭の中で常に明確にしてください。
  • コードを定期的に実行2to3します。(しかし、それが言うことすべてを盲目的に行わないでください。たとえば、使用している場合、d.keys()またはmap(f, l)戻ってくるかどうかを気にしないためlistに、警告が表示されます。2to3お手入れ。)

または、両方で実行されるコードを作成する代わりに、2.xで実行されるコードを作成しますが2to3、実行中の3.xコードに自動的に変換して、インストールプロセスの一部にします(でsetup.py、手順をif sys.version_info >= (3, 0):実行します2to3) 。 。

あなたの編集から、あなたは主に#に何を入れるかについて心配しているように聞こえます!ライン。そのために:

/usr/bin/env python

これが機能することは保証されていenvませんが、そもそも機能することは保証されていません…次の事実を信頼できます。

  • プラットフォーム/ディストロが2.xのみを提供するほぼすべてのシステムでは、Python2が使用されますpython
  • プラットフォーム/ディストロが両方を提供するほぼすべてのシステムに、Python2がありますpython
  • プラットフォーム/ディストロが3.xのみを提供するほぼすべてのシステム(現在は非常にまれですが、おそらく最終的にはより一般的になります)にpythonは、Python3があります。

でも:

  • プラットフォームがどちらも提供しないシステムでは、管理者が3.xのみをインストールした場合、(2013年の初めの時点で)として利用できないpython可能性があります。これについてできることはあまりありません。

最後の問題が深刻な問題である場合は、shで記述されたランチャースクリプトを追加することで回避できます。このスクリプトは、試行し、失敗した場合pythonは試行python3します。

これを行う良い方法は、Pythonスクリプトでランチャースクリプト自体をシバンインタープリターとして指定することです。Linuxはこれを処理できますが、構成可能であり、少なくとも一部のディストリビューションではデフォルトで無効になっています。他のほとんどの*nixシステムでは処理できません。

それが機能しない場合、次善の策は、ユーザーにランチャースクリプトを実行させることです。つまり、の代わりに実行するように指示し、./check.sh適切なPythonインタープリターを見つけてユーザーに実行します。./check.pycheck.sh$python ./check.py

本当にトリッキーにしたい場合は、Pythonスクリプトをシェルスクリプト内にヒアドキュメントとして埋め込むこともできるので、1つのファイルを配布するだけで済みます。それらは実行さ./check.shれ、適切なPythonを見つけて、ヒアドキュメントで実行します。

于 2013-01-04T07:02:21.810 に答える
0

Python3.xがPython2.xと完全に下位互換性があるわけではないことを考えると、スクリプトが両方のバージョンと互換性があることを確認する必要があります。これは2to3ツールの助けを借りて行うことができますが、最終的には2つの異なるPythonスクリプトを実行することを意味する場合があります。

于 2013-01-04T07:00:09.110 に答える