2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Ubuntu20.04にpyenvを使ってPython開発環境を構築するまで

Python環境セットアップ

Python流行ってますね。

Pythonは最近になって大人気になりましたが、生まれはとても古く、JavaやPHPよりも先輩です。古い言語なので最近の主流を取り込めていなかったり、セットアップが面倒だったりするので、そのあたりを整理してみようと思います。

またPythonにもたくさんのパッケージがありますが、新しいバージョンだと動かなかったり、開発で急遽古いバージョンのPythonが必要になったりするときがあります。
こういうときに便利なのがxxenv系のpyenvです。

ただ、pyenvはPythonのコードを落としてビルドするため、OSのライブラリをいくつか必要とします。
また一部ライブラリがなくてもPythonのビルド自体は成功するのですが、pipコマンドでモジュールインストールするときに、ライブラリなしでビルドしたためエラーになることがあります。最低限のライブラリがどれなのか絞って記しておこうと思います。

また折角なのでpoetryを使って、Linter/Formatterの設定までした開発環境を構築するところまで手順を記しておこうとおもいます。

Ubuntu20.04インストール直後

OSインストール直後のおまじないです。
とりあえず再起動しておきましょう。

sudo apt update && sudo apt upgrade
sudo reboot

Pythonビルドに必要なライブラリインストール

必要なライブラリは以下の通りです。

sudo apt install -y git build-essential libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev libffi-dev

パッケージごとに必要なライブラリ

pip installするパッケージによっては、別途に必要にライブラリもあります。
これらパッケージはPythonのビルド後のインストールでも問題ないので適宜追加しましょう

mecabをインストールする場合

sudo apt install mecab libmecab-dev

mysqlclientをインストールする場合

sudo apt install mysql-client libmysqlclient-dev

pyenvセットアップ

ほぼ、公式ページ通りです。pyenvコマンドを使えるようにセットアップしましょう。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
exec "$SHELL"

pythonビルド&インストール

pyenvを使ってPython3.8.6をインストールしてみます。
pyenv install 3.8.6 でソースコードからPythonをビルドするため、それなりに時間がかかります。
最後にglobalとrehashも忘れないようにしましょう。このあたりも公式ページ通りです。

pyenv install 3.8.6
pyenv global 3.8.6
pyenv rehash

以上でPythonの環境セットアップは完了です。

開発プロジェクトセットアップ

pipアップデートとpoetryインストール

Pythonのインストールが完了し、PATHが通ったので、pipコマンドが使用できます。

pipコマンドは、npmで例えると、常時npm i -g状態です。つまりグローバルな環境にパッケージがインストールされます。開発プロジェクトごとに使用するパッケージを分けるのが昨今の常識なのでpoetryをつかいます。

poetry以外にもpipenvというツールもあります。pypa管轄のツールになったのでこちらが主流なのかもしれないですが開発が滞りがちです。。依存関係の解決が遅いのが欠点です。

一方でpoetryは、PEP 518で提案されたpyproject.tomlを使用してパッケージ管理を行います。pythonの標準に従っており、開発も盛んです。

どちらが覇権をとるかは未だにわかりませんが、私はpoetryを使っています。

pip install -U pip
pip install poetry

プロジェクトのディレクトリ作成

mkdir hellopy && cd hellopy
git init
poetry init

poetry initするとインタラクティブな画面になりますので、とりあえずここでは適当に入力していきます。パッケージインストールは後でまとめて行うのでnoにしておきます。

Image from Gyazo

linter & formatter

自分が必ず使用するPythonのlinter/formatterをインストールしておきます。

またgit commit時にこれらlinter/formatterを自動実行するためにpre-commitもいれておきます。

これらは開発用ツールなのでdevDependencyになります。

  • Linter: flake8 mypy
  • Formatter: black isort
poetry add -D flake8 mypy black isort pre-commit

pre-commit

こちらpre-commitの設定ファイルです
下記の.pre-commit-config.yamlをhellopy下に作成して、以下のコマンドを実行しましょう。

これで開発環境は一通り完成です。

pre-commit install
pre-commit
yaml .pre-commit-config.yaml
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v2.3.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer
      - id: check-json
      - id: flake8
      - id: check-yaml
        # - repo: https://github.com/asottile/seed-isort-config
        #   rev: v1.9.3
        #   hooks:
        #     - id: seed-isort-config
  - repo: https://github.com/pre-commit/mirrors-isort
    rev: v4.3.21
    hooks:
      - id: isort
  - repo: https://github.com/psf/black
    rev: 19.10b0
    hooks:
      - id: black
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: "v0.740" # Use the sha / tag you want to point at
    hooks:
      - id: mypy
        additional_dependencies: [sqlalchemy-stubs]

終わりに

なんどか苦戦したので、改めてまとめてみたのですが、意外とシンプルでした。個人的に開発環境セットアップが一番難しいと思う言語はPHPです。phpenvを使うと色々な地獄をみれます。OSベッタリな言語ほど環境構築に苦戦する印象です。

Pythonもいまのブームに乗ってNode.jsくらいシンプルになると良いですね。

というわけで解説は以上になります。よいPythonライフを。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?