複数の 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!) バージョンで正しく動くことを保証するための全テストは、手動でやったのでは非常に時間がかかるだろう。幸い、この問題に対処するツールがいくつかあるので、ここで簡単に論ずる。

自動テストと継続的インテグレーション

自動テスト用のホスト型サービスがいくつかある。これらは通常、ソースコードリポジトリ(GithubBitbucket) を監視し、新たなコミットのたびにプロジェクトのテストスイートを実行する。

これらのサービスは、プロジェクトのテストスイートを 複数バージョンの Python で実行する機能も提供しており、コードが正しく動くかどうかの迅速なフィードバックが得られる。開発者はそうしたテストを自分で実行する必要がない。

Wikipedia に多くの継続的インテグレーションシステムの幅広い 比較 がある。2 つのホスト型サービスを組み合わせて使うことで、Linux, Mac, Windows での自動テストができる:

  • Travis CI は Linux と Mac OSX の両環境を提供する。執筆時点で、Linux 環境は Ubuntu 12.04 LTS Server Edition 64 bit, OSX は 10.9.2 だ。
  • Appveyor は Windows 環境 (Windows Server 2012) を提供する。
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 CIAppveyor はともに 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