スクリプトのお勉強

Pipenv vs Poetry

投稿日:2019年12月30日 更新日:

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を軽く触ってみました。
何かの機会があれば使用してみようと思います。

-スクリプトのお勉強

執筆者:

関連記事

Vue.js 導入編

1.はじめに 近年、web関係で「クライアントサイドJavaScript」というのがトレンドになっているそうです。 「クライアントサイドJavaScript」と、従来のWebアプリケーションとの違いは …

Selenium + Python によるアップロードアプリの動作確認プログラム作成

私の周りでは、なぜかSeleniumが流行っている模様です。 私自身は、Webアプリ的なのも作ってますが、あまり使ってなかったので、使ってみようと思います。 前回作成した、Djangoのupload_ …

Markdown to HTML(grip)

1.はじめに 最近の文書はほとんどMarkdownで書くのですが、それをHTMLに変換する方法を調べました。 ただし、私がMarkdownと思っている文法は「github-flavored-markd …

Nuxt.jsのFormで入力/確認/完了フォームを作成してみた(その1)

背景 今回は、Webアプリケーションの、フロントエンド系のお話です。ほとんどの場合、バックエンドなのですが、時々フロントエンドもするんですよね。。 私の派遣先では、入力フォームを以下のように分ける要望 …

seaborn + Pandas + Python によるグラフ描画(その2: グラフ描画編)

前回の続き 前回の続きです。 折れ線グラフ まずは折れ線グラフを描画したいと思います。 描画するのは以下です。 運用商品(4つ)日経平均 以下で起動します。引数(dataset-2017-201908 …