Python

開発チームでpipenvを導入してみた

はじめに

こんにちは!開発Gのタオです。トライステージTech Blogで初めての投稿です。2021年10月にトライステージに入社して社内システム開発の仕事をやっています。

本件に入る前にpipenv導入しようとしたきっかけについてすこしお話ししたいと思います。
トライステージではPythonを用いるプロジェクトを結構持っています。初回にてGitからソースをローカルにCloneしてプロジェクトを起動しようとしてみたら、下記の課題が出てきました。

  1. プロジェクトが動くために必要なパッケージがどこにも管理されていませんでしたので、実行してメッセージを見て足りないパッケージをpip installという時間かかる作業を繰り返していました。
  2. ようやくpip installが終わりましたが決まったバージョンでないと正常に動作しませんでした。

その後、開発Gの方にpip freeze>requirements.txtでパッケージ一覧をもらってパッケージをインストールできましたが、今後に新しいメンバーが入る時、または新しいパッケージを入れる時などの面倒臭さを考えたら、やはり、ソース中でパッケージを管理するべきだと思いました。それで今まで使っていた人気のあるpipenvというツールを導入することになりました。

pipenvとは

pipenv とは、Python のパッケージ管理と仮想環境の構築を簡単に、自動で行ってくれる便利なツールです.pip と virtualenv の 2 つがセットになって使いやすくなったと考えれば、分かりやすいですね。
ということは必要なパッケージを簡単にインストールすることだけでなく、pipenvのおかげでプロジェクトごとに独立の仮想環境を構築することもできるようになります。

つぎはpipenvの基本な使い方になります。pipとほとんど似てますので使ったことがない方でもすぐ使いこなせそうです。

pipenvの基本的な使い方

基本的な使い方としてpipenvの公式なドキュメントにあるPipenvのワークフローの例をあげます。

  1. プロジェクトのレポジトリをクローンまたは作成する:
    $ cd myproject
  2. Pipfileがあった場合には、Pipfileの内容でインストールする:
    $ pipenv install

    もしくは、新しいプロジェクトにパッケージを追加する:
    $ pipenv install <package>

    このコマンドは Pipfile が無ければ作成します。 既に存在していた場合は、引数で与えたパッケージが追加されるよう自動的に Pipfile を編集します。
  3. 次に、Pipenvシェルを有効化する:
    $ pipenv shell
    $ python –version


    このコマンドは新しいシェルのサブプロセスを立ち上げます。このプロセスは exit を使って停止できます。

詳しくはPipenv公式にも記載されております:Pipenvの基本的な使い方 — pipenv 2018.11.27.dev0 ドキュメント (pipenv-ja.readthedocs.io)

既存プロジェクトにpipenvを導入した手順

下記の手順で既存プロジェクトにPipenvを導入して進めました。

  1. 導入する目的を明確にする
    今回のpipenv導入するのはあくまで各プロジェクトのパッケージを管理することで開発の都合をよくすることが目的となります。
  2. 導入とするプロジェクトをリストする
  3. プロジェクトのPythonと利用すパケッジとバージョンを確認し、バージョン指定でpipenvでインストール
    pipenvに切り替えてプログラムが正常動作できるためには本番環境と同じPythonとパケッジを同じバージョンでインストールする必要があります。
    パッケージを洗い出すには下記のようにすこし工夫が必要があります。

    下記のコマンドでパケッジとバージョンを出力できます。
    $ pip freeze > requirements.txt

    しかし、requirements.txtに入る全てのパケッジをpipenvインストールしてはいけないのです。なぜかというとrequirements.txtに入るのは意図的に入れたパッケージの他に既存のパケッジも沢山入りますのでそのままpipenvインストールしたらパケッジのバージョンの衝突になる可能性が高いし、将来あるパッケージのバージョンをアップグレードすることも大変難しくなります。

    そこでソースコード中のimport文から利用するパッケージを洗い出してrequirements.txt中のバージョンを参照し、pipenvのインストールを実施しました。
    例:
    $ pipenv install pandas==1.1.5
  1. 動作確認
    既存のテストケース実施したり、プログラムを動かしたりして正常動作確認を行いました。
  2. 運用方針を共有する
    pipenvを入れるにあたって下記のルールを守るようにチームメンバーに共有しました。
    – 新規パッケージを入れる際にバージョン指定
    – pipenvによる変更ファイルのPipfileとPipfile.lockをGitコミットに追加

まとめ

各プロジェクトにpipenvを入れることができました。これで新人が開発環境を初期化する際やパッケージの変更を各メンバーの環境に反映も簡単にできるようになって開発がより楽になると思います。

これからも他に改善できるポイントを探して積極的に検討していきたいと思います。