1. はじめに
Pythonでお仕事していると、どうしても、環境設定を行う必要があります。
本番環境で動作するように、設定しなければいけないからです。
いろんな状況はあるでしょうが、私がかかわるプロジェクトだと、自分で環境設定をすることが多いです。
本記事では、Pythonの動作環境設定方法として、Poetryというのを調べてみたので、よく使っているPipenvと比較してみたいと思います。
1.1 Python3での環境設定には決まった方式がない
ここでの「環境設定」とは、2つの意味を含みます。
- 動作環境設定、自分で作ったソースをどう起動するか
- 使用するライブラリの依存関係をどう設定するか
Python3の場合、決まった流儀が存在しません。なのでいろいろ試行錯誤している最中です。
1.2 ここでは「動作環境設定」重視
主にWebアプリケーション等のような、起動するプログラムを作るのか、
それともライブラリを作るのか、によって環境設定の重点が違います。
ということは、人によって強調する部分が異なることになります。
私の場合は、Webアプリケーション系が多いので、どうしても「動作環境設定」
の方を重視しています。
なので、以降、「動作環境設定」について重点的に書いています。
2 有名な環境設定方法(pyenv + pip vs Pipenv vs Poetry)
有名な環境設定方法として以下があります。
軽く説明しておきましょう。
2.1 pyenv(pyvenv) + pip
pyenv
pyenvとは、各ディレクトリごとに、Python3自体(pythonランタイム/ライブラリ全部)の環境 (==仮想環境)を生成するプログラムです。
pyvenvは、その簡易版に近いです。Python3.4以降で標準的に入っています。
pyenv等で、仮想環境を作成して、その中にライブラリ等をインストールする方法がよく使われます。
pip
ライブラリのインストール方法として、最低限の方法はrequirements.txt
を使用する方式でしょう。
requirements.txtというファイルに、使用するライブラリ名を記述し、
pipコマンドでpip install -r requirements.txt
として、インストールするというのが最低限の方法です。
pipは仮想環境上ではなく、システム上のPythonでも使用します。
ただし、システム上でライブラリをインストールすると、
そのホスト全てで使用するライブラリになるので、バージョンアップに支障をきたします。
そのために、多くは仮想環境を作成してライブラリをインストールします。
2.2 Pipenv
比較的新しい方法です。「環境設定」を一発で行うツールです。pyenvとpipが合体したものだと
思えばいいです。
requestsというライブラリの作者だそうで、Pipfileというファイルに
ライブラリ群を記述しておきます。正確には、以下のようにコマンドを起動するのでPipfileを直接編集することはありません。
$ pipenv install requests
Pipenvはpipコマンドと違い、仮想環境を作成する機能があります。以下のようにプログラムをPipenvが自動で作成した、仮想環境上で起動することができます。
$ pipenv run python3 exec.py
まだこなれていないので、使ってる人は少ないかもしれません。
私は積極的に使ってますが、あまり人に勧められません。理由は後述します。
3 Poetry
やっと本題です。PoetryというPipenvと同等のツールがあるそうなので、ちょっと使ってみました。
環境
以下の環境で確認しました。
- OS: ubuntu 18.04
- Python3.6
- Poetry 1.0.0
インストール
以下でインストールします。
$ curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python3.6
インストールすると、以下だそうなので、PATHを通しておきます。
To configure your current shell run `source $HOME/.poetry/env` $ source $HOME/.poetry/env $ which poetry /home/tanino/.poetry/bin/poetry
プロジェクト作成/初期化
プロジェクト、というのを作成できるそうです。以下で作成できます。
$ poetry new . --name myp
以下のようにファイルが生成されます。
README.rst myp/ __init__.py pyproject.toml tests/ __init__.py test_myp.py
pyproject.tomlに、ライブラリの依存関係を記述するそうです。以下のように起動すると、poproject.tomlに書いてあるように、そのディレクトリでの環境にインストールします。
$ poetry install
–no-devで、dev環境用ライブラリをインストールせずに環境を設定することもできます。
起動すると、poetry.lockというファイルを作成します。
ライブラリインストール
ライブラリをインストールするには、以下のようにコマンドを起動します。
$ poetry add requests
起動すると、ライブラリと、そのライブラリの依存関係をインストールし、poetry.lock
を更新するようです。
実行
Python3を起動するときや、Python3スクリプトを動作させるときは、以下のように実行します。
$ poetry run python3 -V
4.軽く触ってみた感想
上記のように軽く触ってみたのですが、ubuntu 18.04で使用すると、以下のようにPython自体のバージョンが2.7.15になります。
$ poetry env info /home/tanino/.poetry/lib/poetry/_vendor/py2.7/subprocess32.py:149: RuntimeWarning: The _posixsubprocess module is not being used. Child process reliability may suffer if your program uses threads. "program uses threads.", RuntimeWarning) Virtualenv Python: 2.7.15 Implementation: CPython Path: /home/tanino/.cache/pypoetry/virtualenvs/myp-QY6xace0-py2.7 Valid: True System Platform: linux2 OS: posix Python: /usr
理由は、いまいち不明ですが、インストールする一番最初に、/usr/bin/env python
を前提としていると思われます。
今使用している環境では、以下のように2.7.15になるので、poetryも2.7.15になるのでしょう。
$ /usr/bin/env python -V Python 2.7.15+
ライブラリ作成には有用
Pipenvと比較すると、ライブラリ作成には有用だと思います。
Pipenvが使えなさすぎのような気がしますが。。
Pipenvを置き換える程ではない
ただ、既に、Pipenvのプロジェクトである場合、置き換える程でもないかと思います。
私が「動作環境設定」優先なのと、Poetryにある「動作環境設定」用の機能はPipenvと変わらないから、が理由です。
ただし、Poetryの方が動作の安定度という意味では上だと思います。
Pipenvを勧められない理由
Pipenvを勧められない一番は、動作がいまいち安定していないことです。
なかなか「これっ」ていう決定的な「不安定項目」はありませんが、動作があまり信頼できないです。
その以外にも以下が不満です。個人的な内容が多いですが。。
- pipenv installすると、その時点でインストールしているライブラリの全バージョンがアップデートされる。
- pipenv installしても、通常ではアップデートされない方に倒してほしい。
- 既にインストールしたライブラリのアップデートは
pipenv updateとかをした時だけにしてほしい。- 勝手にバージョンアップされると、本来はテストし直しになってしまうので。
- pipenv install時に、間違って存在しないライブラリを指定した場合でも、Pipenvに残り続ける。
pipenv install reqestsss
とか間違った場合に、reqestsssがPipfileに残り続ける- エラーになったらPipfileは更新しないようにしてほしい。
- pipenvはライブラリベースにほぼ使用できない。
- Poetryにあるpublishは便利なのでたしかにほしい。
- Pythonランタイムに標準で入れてほしい。
- Pythonをインストールしたら、自動的に入っているようにしておいてほしい。でないと最初からは使えない。
- 私は結構重視するのだが、なかなかいいツールがない。
5.おわりに
Poetryを軽く触ってみました。
何かの機会があれば使用してみようと思います。