この記事はLIFULLその2 Advent Calendar 2018の1日目の記事です。
普段からPipenvを使ってPythonでアプリケーション開発をしているのですが、Pythonパッケージを社内用に提供する必要があり、その際に以下のような疑問が生まれていました。
- Pipenvはバージョン固定するためのツールで、テストは複数のPythonバージョンで行いたい
- 依存ライブラリの記述にsetup.pyとPipfileって結局どう使い分ければいいの?開発時だけに必要なライブラリもPipenv(Pipfile)で記述したいんだけど…
結論からいうと、公式ドキュメントで紹介されている手順に従って、以下のように行うと良いようです。
- 開発用ライブラリはPipenvを使って管理しよう
- toxを使って複数バージョンのテストを管理しよう(また、もう一つ紹介されているTravis CIも紹介されています)
実際にプロジェクトを作ってテストする
実際に、Python2.7とPython3.6でテストしてみました。この2バージョンを利用したのは、私の環境で既に動いているからで、実際には複数バージョンのインストールと指定が必要です。
また、今回使用したコードは以下に置いてあります。
この前の記事は"test"以下にテストコードを置きましたが、今回はpipenvのドキュメントに合わせて"tests"の下に置きました。Pythonではプロジェクトの標準的なディレクトリ構成が厳密には決められていないようです。
$ tree
.
├── MANIFEST
├── Pipfile
├── Pipfile.lock
├── README.md
├── setup.py
├── src
│ ├── __init__.py
│ └── script.py
├── tests
│ ├── __init__.py
│ └── test_script.py
└── tox.ini
toxは、実際にそれぞれのバージョンで仮想環境を作って、その中でpytestのコードを実行してくれます。
# !/usr/bin/env python
from distutils.core import setup
setup(name='sample',
version='0.1',
description='sample',
author='sample',
author_email='sample@sample.sample',
url='',
packages=['src'],
)
.tox以下のディレクトリに大量のライブラリができるので、テスト実行前に.gitignore
には.toxを記述しておきましょう。VS Codeのgit機能が悲鳴を挙げてました。
tox.iniはpipenvの公式のサンプルを元に記述しています。ついでにflake8で規約チェックもします。
[tox]
envlist = flake8-py3, py27, py36
[testenv]
deps = pipenv
commands=
pipenv install --dev
pipenv run py.test tests
[testenv:flake8-py3]
basepython = python3.6
commands =
pipenv install --dev
pipenv run flake8 --version
pipenv run flake8 setup.py docs project test
これでtoxコマンドでテストを実行することができます。
$ tox
(中略)
_______________________________________________________________________ summary _______________________________________________________________________
flake8-py3: commands succeeded
py27: commands succeeded
py36: commands succeeded
congratulations :)
まとめ
今後は、以下のようにPythonによる開発とユニットテストを行っていこうと思います。
- アプリケーション開発ではpipenvで管理して、一つのPythonバージョンでテストを実行
- ライブラリ開発では更にtoxを利用して複数バージョンのテストを回す
今回の例では存在しないのですが、実際にライブラリの開発では依存ライブラリをsetup.pyとPipfileの両方に記述することになります。今後、より良いライブラリの依存関係の管理方法が現れることを期待したいです。
参考記事
Pipenv公式ドキュメント Pipfile vs setup.py
※日本語訳
PipenvでPythonの依存関係の管理は楽になったか?