私は何千ものサーバー(Linux)を持っています.Python 2.xしかないものもあれば、Python 3.xしかないものもあります.1つのスクリプトを書きたい. python check.py または $python3 check.py、これを行う方法はありますか?
私の質問は、インタープリターが python2.x と python3.x であっても、スクリプト check.py がインタープリターを見つける方法です。
私は何千ものサーバー(Linux)を持っています.Python 2.xしかないものもあれば、Python 3.xしかないものもあります.1つのスクリプトを書きたい. python check.py または $python3 check.py、これを行う方法はありますか?
私の質問は、インタープリターが python2.x と python3.x であっても、スクリプト check.py がインタープリターを見つける方法です。
多くのスクリプトは、2.xと3.xの両方で実行できます。(私は毎日作業しているものがたくさんあり、さまざまなオープンソースライブラリを2.xのみからデュアルバージョンに変換しました。)
いくつかのことがそれをはるかに簡単にします:
u
プレフィックスが削除されるなど)は、3.2または3.3で逆転しました。__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
ませんが、そもそも機能することは保証されていません…次の事実を信頼できます。
python
。python
。python
は、Python3があります。でも:
python
可能性があります。これについてできることはあまりありません。最後の問題が深刻な問題である場合は、shで記述されたランチャースクリプトを追加することで回避できます。このスクリプトは、試行し、失敗した場合python
は試行python3
します。
これを行う良い方法は、Pythonスクリプトでランチャースクリプト自体をシバンインタープリターとして指定することです。Linuxはこれを処理できますが、構成可能であり、少なくとも一部のディストリビューションではデフォルトで無効になっています。他のほとんどの*nixシステムでは処理できません。
それが機能しない場合、次善の策は、ユーザーにランチャースクリプトを実行させることです。つまり、の代わりに実行するように指示し、./check.sh
適切なPythonインタープリターを見つけてユーザーに実行します。./check.py
check.sh
$python ./check.py
本当にトリッキーにしたい場合は、Pythonスクリプトをシェルスクリプト内にヒアドキュメントとして埋め込むこともできるので、1つのファイルを配布するだけで済みます。それらは実行さ./check.sh
れ、適切なPythonを見つけて、ヒアドキュメントで実行します。
Python3.xがPython2.xと完全に下位互換性があるわけではないことを考えると、スクリプトが両方のバージョンと互換性があることを確認する必要があります。これは2to3
ツールの助けを借りて行うことができますが、最終的には2つの異なるPythonスクリプトを実行することを意味する場合があります。