pyenv + pipenvの環境で今やっているので, 最初に何をやっているのかのメモです.

Python初心者さんなど いれば 参考にしていただけたらと思います. こうしたらいいんじゃないの? みたいなことがあれば, 教えていただけると幸いです.

最近はpoetryが人気なので, 本当はpipenvではなくてpoetryを使った方がいいかもしれないです …

PCの環境構築

pyenvの設定

pyenvは Pythonのバージョンを管理するためのツールです.

ついでに pyenvのプラグインもインストールしておきます.

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update    # updateをするにはこれが必要

.zshrcにも設定します. zsh以外のシェルを使っている人は適宜変更してください.

export PATH=$PATH:$HOME/.pyenv/bin
export PYENV_ROOT=$HOME/.pyenv
eval "$(pyenv init -)"

次にグローバルのpythonのバージョンを最新にしておきましょう.

$ pyenv install -l | egrep "^\s*\d.\d.\d" 
...
...
...
  3.7.6
  3.8.0
  3.8.1

ということで, 3.8.1が最新のバージョンのようなので, globalに設定しておきます.

$ pyenv install 3.8.1   # install 3.8.1
$ pyenv global 3.8.1
$ source ~/.zshrc   # 念のため pyenv initを実行しておく
$ python --version
Python 3.8.1

pipenvのインストール

pyenvのglobalで使っているバージョンのpipenvを使うようにしておきます.

$ export PIPENV_PYTHON=$PYENV_ROOT/shims/python

pipenvをインストールします.

$ pip install pipenv
$ pip --version
pip 19.3.1 from /Users/yassu/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pip (python 3.8)

リポジトリの環境構築

pyprojectという名前のライブラリを作ってみます.

$ mkdir pyproject
$ cd pyproject
$ pipenv install flake8 invoke ipython isort py-term pytest pytest-cov typing-extensions yapf

setup.cfgを作る

setup.cfgに以下のように書きます. このファイルは プロジェクト全体の設定ファイルです.

[mypy]
show_column_numbers = True
show_error_context = True
ignore_missing_imports = True
follow_imports = skip
check_untyped_defs = True
warn_unused_ignores = True
strict_optional = False

[flake8]
max-line-length = 99
exclude = original/, wikiextractor/, fastText/

[isort]
line_length = 99
include_trailing_comma = true
order_by_type = 1
balanced_wrapping = 1
multi_line_output = 3

[yapf]
column_limit = 99
based_on_style = google
split_before_first_argument = true
dedent_closing_brackets = false

tasks.pyを作る

tasks.pyを作ります. これで inv {command}が使えるようになります.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task

import term


def print_title(title: str):
    term.writeLine("running " + title, term.green)


@task
def format(ctx):
    ctx.run("isort -rc .")
    ctx.run("yapf -r . --in-place")


@task
def test(ctx):
    """ テストする """
    print_title("flake8")
    ctx.run("flake8")

    print_title("pytest")
    ctx.run("pytest -vv tests/")

    print_title("isort")
    ctx.run("isort --check-only -rc .")

conftestを書く

conftest.pyを書く. これは pytestがtests/以下のテストファイルを実行される前に実行されるファイルです.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

sys.path.append('.')

ライブラリ, テストファイルを作る.

pyproject.fibにfib関数のみを追加して, 単純なテストを一つだけ作っておきます.

pyproject/fibに以下のようにfib.pyを作成します.

#!/usr/bin/env python
# -*- coding: utf-8 -*-


def fib(n):
    return n if n in (0, 1) else fib(n - 1) + fib(n - 2)

念のため pyproject/__init__.pyを作っておきます.

$ touch pyproject/__init__.py

テストファイルをtests/fib_test.pyに作成します:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pyproject.fib import fib


def test_fib():
    assert fib(6) == 8

テストを実行する

$ pipenv run inv test