複数の Python バージョンのサポート¶
Page Status: | Incomplete |
---|---|
Last Reviewed: | 2014-12-24 |
FIXME
Useful projects/resources to reference:
- DONE six
- DONE python-future (http://python-future.org)
- tox
- DONE Travis and Shining Panda CI (Shining Panda no longer available)
- DONE Appveyor
- DONE Ned Batchelder's "What's in Which Python"
- http://nedbatchelder.com/blog/201310/whats_in_which_python_3.html
- http://nedbatchelder.com/blog/201109/whats_in_which_python.html
- Lennart Regebro's "Porting to Python 3"
- Greg Hewgill's script to identify the minimum version of Python
required to run a particular script:
https://github.com/ghewgill/pyqver
- the Python 3 porting how to in the main docs
- cross reference to the stable ABI discussion
in the binary extensions topic (once that exists)
- mention version classifiers for distribution metadata
Python パッケージを作る際、異なるバージョンの Python で使えるようにする必要がしばしば生じる。異なる Python バージョンには異なる(または別名の)標準ライブラリが含まれるかもしれず、また Python バージョン 2.x, 3.x 間では構文を含めた変更が行われている。
パッケージが全てのターゲット Python (および OS!) バージョンで正しく動くことを保証するための全テストは、手動でやったのでは非常に時間がかかるだろう。幸い、この問題に対処するツールがいくつかあるので、ここで簡単に論ずる。
自動テストと継続的インテグレーション¶
自動テスト用のホスト型サービスがいくつかある。これらは通常、ソースコードリポジトリ(Github や Bitbucket) を監視し、新たなコミットのたびにプロジェクトのテストスイートを実行する。
これらのサービスは、プロジェクトのテストスイートを 複数バージョンの Python で実行する機能も提供しており、コードが正しく動くかどうかの迅速なフィードバックが得られる。開発者はそうしたテストを自分で実行する必要がない。
Wikipedia に多くの継続的インテグレーションシステムの幅広い 比較 がある。2 つのホスト型サービスを組み合わせて使うことで、Linux, Mac, Windows での自動テストができる:
TODO Either link to or provide example .yml files for these two
services.
TODO How do we keep the Travis Linux and OSX versions up-to-date in this
document?
Travis CI と Appveyor はともに YAML 形式のファイルを必要とし、これがテスト指示書の仕様となる。失敗したテストがあれば、指定した構成の出力ログを検査できる。
Python プロジェクトを単一ソースで Python 2, 3 両方へデプロイしたい場合、方法はいくつかある。
単一ソース Python パッケージ用ツール¶
six は Benjamin Peterson が開発したツールで、Python 2 と Python 3 の間の違いを吸収するためのものだ。six パッケージは広く使われており、Python 2 と 3 の両方で使える単一ソース Python モジュールを書くための信頼できる方法と考えられる。six モジュールは Python 2.5 の時点から使われていた。Armin Ronacher が開発した modernize というツールを使うと、six によるコード修正を自動で適用できる。
six と似たものとして python-future パッケージがあり、これは Python 2 と Python 3 の間の互換レイヤを提供する; ただしこのパッケージは six と異なり、2 つの Python バージョンの一方に合致する構文を使うことで Python 2 と Python 3 の相互運用性を実現しようとする。つまり:
- Python 3 プロジェクトで(構文上の) Python 2 モジュールが使える。
- Python 2 プロジェクトで(構文上の) Python 3 モジュールが使える。
この双方向性により、python-future は Python 2 パッケージを Python 3
構文へモジュールごとに変換する方法を提供する。しかし、six とは対照的に、python-future は Python 2.6 以降でのみサポートされる。six に対する modernize と同様、python-future には futurize
, pasteurize
という 2 つのスクリプトが付属しており、Python 2 モジュールと Python 3
モジュールそれぞれに適用できる。
six または python-future を使うと、パッケージに実行時の依存関係が追加される: python-future を使う場合、 futurize
スクリプトを
--stage1
オプション付きで呼び出すことができ、これは Python 2.6+ が既に Python 3 への前方互換性を持つ変更のみを施す。残りの互換性問題は手動で解決する必要がある。
どの Python で何が変わった?¶
Ned Batchelder が各 Python リリースでの変更点のリストを Python 2, Python 3 について個別に提供している。これらのリストは Python バージョン間での変更点がパッケージに影響するかどうかのチェックに使えるかもしれない。
TODO These lists should be reproduced here (with permission).
TODO The py3 list should be updated to include 3.4