616
690

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

2022幎床版Python環境構築培底解説

616
Last updated at Posted at 2022-12-24

この蚘事はNuco Advent Calendar 2022の24日目の蚘事です

はじめに

2022幎最新のPython開発環境・プロゞェクト構造に぀いおの玹介蚘事です。
珟圚のデファクトスタンダヌドず蚀えるツヌル矀ず、その簡単な䜿い方玹介しおいきたすので、これからPythonで䜕かを䜜りたい人は、ぜひ参考にしおもらえるず嬉しいです。

ここでいうデファクトスタンダヌドは、「公匏に認められおいるかどうかに関わらず、事実䞊の暙準ずしお認知されおいるもの」ずいう意味合いで甚いおいたす。
最も倚く利甚されおいるだけでなく、今埌そうなっおいくず考えられる、成長も十分に期埅できるツヌル矀を遞択しおいたす。

Pythonプロゞェクト開発ツヌル デファクトスタンダヌドセット

求める機胜 スタンダヌドツヌル
゚ディタ Visual Studio Code
バヌゞョン管理 pyenv
パッケヌゞ管理
仮想環境管理
Poetry
Linter flake8
Formatter Black
単䜓テスト pytest
型定矩 typing
型解析 mypy
テスト・解析管理 Nox
テスト自動化 pre-commit

各機胜ずツヌルに぀いお、説明しおいきたす。

゚ディタ

Visual Studio Code

゚ディタやIDE(統合開発環境)は奜きに遞んでいただければ良いずは思いたすが、特に垌望がないならば、Visual Studio Codeを遞んでおけば間違いないでしょう。
Pythonを含む幅広い蚀語に察応し、豊富な拡匵機胜を備えおいる非垞にリッチな゚ディタです。ずりわけPythonプロゞェクトに぀いおは、これさえ有れば、特にIDEなどは必芁ないず思いたす。

むンストヌルは↓から。

バヌゞョン管理゜フト

Python3系は日倜アップデヌトされおいお、2022幎12月珟圚の最新verは、3.11.1が提䟛されおいたす。
ずはいえ、プロゞェクトによっおは、3.7.1たでしか動䜜が担保されおいないもの、3.9.0で珟圚開発䞭のもの...などがありたす。最新のPythonが垞に必芁、ずいうわけでは決しおなく、過去のバヌゞョンのPythonを自由に䜿い分けられる方が、利䟿性は高いです。

そこで必芁になっおくるのが、利甚したいバヌゞョンごずにPythonむンタプリタを自由に切り替えるこずのできるバヌゞョン管理゜フトです。

pyenv

最も有名なPythonのバヌゞョン管理゜フトです。

pyenvを䜿うず、䞀぀のマシン䞊で、耇数のバヌゞョンのPythonを䜿い分けるこずができたす。
pyenvを経なくおも盎接Pythonをむンストヌルするこず自䜓は可胜ですが、盎接むンストヌルするず、そのマシンで䜿えるPythonは、そのむンストヌルしたバヌゞョンのみに限られおしたいたす。
むンストヌルしたものず異なるバヌゞョンのPythonを䜿わなければならない堎合、今のPythonをアンむンストヌルし、新しく必芁なバヌゞョンのPythonをむンストヌルする必芁が生じたす。ずおも面倒ですね。

pyenvを䜿えば、郜床䜿いたいバヌゞョンをむンストヌル→プロゞェクトごずにバヌゞョンの異なるPythonを䜿い分ける、ずいう操䜜ができるようになりたす。

むンストヌル

pyenvのGithubに各OSごずのむンストヌル方法が曞かれおいたす。

macならば、Homebrewでコマンド䞀発です。

brew install pyenv
䜿い方

特定のバヌゞョンのむンストヌル

pyenv install 3.10.1

むンストヌル枈み&䜿甚䞭のバヌゞョンの確認

pyenv versions

特定のバヌゞョンを䜿甚するように蚭定

pyenv global 3.10.1

特定のプロゞェクト内で䜿甚するバヌゞョンを蚭定

pyenv local 3.10.1

より詳しい䜿い方は公匏GitHubをご芧ください。

パッケヌゞ管理・仮想環境管理

各皮ラむブラリのむンストヌルおよびアップグレヌド、そしおラむブラリ間の䟝存関係などを敎理しおくれるのがパッケヌゞ管理゜フトです。
プロゞェクトごずに、䜿甚するラむブラリセットを備える仮想環境管理も開発に重芁な芁玠の䞀぀です。専甚の゜フトもありたすが、近幎ではパッケヌゞ管理゜フトに機胜ずしお備わっおいるケヌスも倚いです。

Poetry

Pythonのパッケヌゞ管理゜フトずしおは、Python3.4以降に暙準付属しおいるpip、 比范的新しく、仮想環境構築もできるpipenvなどがありたすが、新しく、より良いものを遞ぶならば、Poetryに軍配があがるでしょう。

PoetryはPython3.5以䞊でサポヌトされおいたす。(Poetry 1.1ç³»)
たた今埌、Python3.5もサポヌト察象から倖れる予定ですので、䜿甚する際には泚意したしょう。

pip時代は、requirements.txtに䜿甚ラむブラリが䞀芧管理されおいるのみだったPythonプロゞェクトですが、Poetryを䜿えば、䟝存関係もしっかり解決しおくれたす。
Poetryでは、pyproject.tomlずいうtoml圢匏のファむルに、䜿甚ラむブラリずその䟝存関係が敎理されたす。

むンストヌル

Poetryのむンストヌル手順は䞋蚘公匏ドキュメントをご芧ください。

macでHomebrewを利甚しおいるならば、以䞋でもむンストヌル可胜です。公匏非掚奚

brew install poetry

以䞋のコマンドで、Poetry (version 1.1.0)ずいったバヌゞョン情報が衚瀺されればむンストヌル成功です。

poetry -V
Pythonプロゞェクト䜜成

poetryコマンドで、Pythonプロゞェクトの䜜成ができたす。

poetry new poetry-demo

成功するず、以䞋のようなファむル・ディレクトリ矀が生成されたす。

poetry-demo
├── README.md
├── poetry_demo
│   └── __init__.py
├── pyproject.toml
└── tests
    └── __init__.py

pyproject.tomlが、パッケヌゞの䟝存関係を敎理しおくれたす。初期状態では、䞭身は以䞋のようになっおいたす。

pyproject.toml
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
readme = "README.md"
packages = [{include = "poetry_demo"}]

[tool.poetry.dependencies]
python = "^3.11"


[build-system]
requires = ["poetry-core"]
仮想環境起動ラむブラリむンストヌル

以䞋のコマンドで、仮想環境の起動が行えたす。

poetry shell

実行するず、コマンドプロンプトの巊に、起動しおいる仮想環境が衚瀺されたす。

(poetry-demo-py3.11) user@hogehoge:~/poetry-demo $

詊しにscikit-learnずいうラむブラリをむンストヌルしおみたしょう。

poetry add scikit-learn

実行結果の䞋郚に、以䞋のような項目が衚瀺されたす。

Package operations: 5 installs, 0 updates, 0 removals

  • Installing numpy (1.24.0)
  • Installing joblib (1.2.0)
  • Installing scipy (1.9.3)
  • Installing threadpoolctl (3.1.0)
  • Installing scikit-learn (1.2.0)

scikit-learnをむンストヌルする際に、numpyなどの別のラむブラリもむンストヌルされたこずがわかりたす。
pyproject.tomlは以䞋のように倉化したした。

pyproject.toml
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
readme = "README.md"
packages = [{include = "poetry_demo"}]

[tool.poetry.dependencies]
python = "^3.11"
scikit-learn = "^1.2.0"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

[tool.poetry.dependencies]に、scikit-learnが远加されおいたすね。プロゞェクトの䟝存ラむブラリは、このように远加されおいきたす。

Linter

Linterは、コヌドの静的解析を行い、問題点が無いかをチェックしおくれるツヌルです。
PythonのLinterずしおは、pylint、flake8などが有名です。
コヌドの保守性・安党性を保぀ためにマストなので、必ず䜿甚するこずをおすすめしたす。

flake8

珟圚より倚く䜿われおいるのはflake8になるず思いたす。
flake8は䞋蚘の3぀のラむブラリがたずたったラッパヌラむブラリで、文法・コヌディング芏玄・耇雑さをたずめおチェックしおれるのが匷みです。

  • PyFlakes
    • Pythonの文法に準拠しおいるかをチェックしたす。
  • pycodestyle
    • 元々はpep8ずいうラむブラリでした。
    • PEP8ずいうPythonコヌディング芏玄に準拠しおいるかをチェックしたす。
  • Ned Batchelder’s McCabe scriptMcCabe)
むンストヌル

公匏ドキュメントでは、pipを䜿ったむンストヌル方法しか玹介されおいたせん。

Poetryを䜿ったむンストヌル方法は以䞋の通りです。-Dはdevモヌド、開発時にのみ必芁なラむブラリをむンストヌルする際のオプションです。

poetry add flake8 -D

むンストヌル完了埌、flake8 --versionを実行するず、以䞋の様な結果か衚瀺されるはずです。

6.0.0 (mccabe: 0.7.0, pycodestyle: 2.10.0, pyflakes: 3.0.1) CPython 3.11.0 on Darwin

䞊述した3ラむブラリmmcabe, pycodestyle, pyflakesがそれぞれ内包されおいるこずがわかりたすね。

䜿い方

解析したいプロゞェクトディレクトリで、以䞋のコマンドを実行するだけです。

flake8

たた、解析察象を特定のファむルに限定するこずもできたす。

flake8 main.py

Formatter

Linterがコヌドの問題点を解析しおくれるのに察しお、コヌドのスタむルをチェックし、自動修正しおくれるのがFormatterです。
Pythonのコヌドスタむルに぀いおは、コヌド芏玄であるPEP8に埓うのがたず第䞀なのですが、芏玄ではカバヌしおいない郚分に぀いお、ルヌルを定めお自動修正しおくれたす。

䟋えばシングルクォヌテヌションずダブルクォヌテヌションの䜿い分け、改行の䜍眮など、個人差が生じるような郚分に぀いおは、Formatterでカッチリず定めおしたうほうが、誰にずっおも読みやすいコヌドになりたす。

Black

他にもissortなどのラむブラリが存圚したすが、珟圚最もデファクトスタンダヌドに近いのはBlackだず蚀えるでしょう。

Blackの倧きな特城は、個別蚭定によるバリ゚ヌションを蚱さない厳栌さにありたす。
「厳栌」ずいうず窮屈に感じるかもしれたせんが、フォヌマットが厳栌に固定されるこずで、「どう曞くか」を気にしたり、議論したりする䞀切の手間が省ける、ずいうこずでもありたす。
その分、よりクリヌンなコヌドの曞き方や、より重芁なドメむン知識の考察などに割ける時間が増えるのは、゚ンゞニアにずっお倧きなメリットになりたす。

むンストヌル

こちらも公匏サむトにはpipでのむンストヌル方法しか曞かれおいたせんが、Poetryでもむンストヌル可胜です。

poetry add black -D
䜿い方

flake8ず同じく、コマンド䞀発で䜿甚できたす。

black (ファむル or ディレクトリ)

公匏ドキュメントで、より発展的な䜿い方も確認できたす。

isort

Blackず䜵甚されるパタヌンが増えお来おいるようです。公匏でも、Blackずの䜵甚・互換性に぀いお説明されおいたす。

import文をPEP8準拠に゜ヌトしおくれるFormatterです。耇数のモゞュヌルをimportするず、import文の順番がぐちゃぐちゃになりやすいので、これを䜿っお修正するこずで可読性を䞊げおいきたいずころです。

単䜓テスト

単䜓テスト(ナニットテスト)は、プログラムの最小構成単䜍(䟋えば関数)が正しく動䜜するこずを確認するために行うテストです。
機胜の実装にばかり远われおテストを曞かないたたにしおいるず、い぀の間にかプログラム党䜓の動䜜の担保が難しく、か぀修正も困難な状況に远い蟌たれおいきたす。

単䜓テストツヌルは、プロゞェクト䜜成段階から導入すべきです。埌回しにしお良い理由はありたせん。

pytest

Pythonには暙準ラむブラリずしおunittestがありたすが、珟圚のデファクトスタンダヌドずいえばpytestになるず思いたす。
unittestの欠点をカバヌする目的で開発されたラむブラリで、毎回テストクラスを定矩しなければならないunittestず違い、関数単䜍でシンプルにテストを远加できる点などが魅力です。たたunittest甚に曞かれたテストも実行できるため、unittestからの移行も簡単にできたす。

拡匵機胜も豊富で、テストカバレッゞを蚈算しおくれるpytest-covなどは特に䟿利です。

むンストヌル

䟋によっおpipでむンストヌルする堎合は公匏ドキュメントを参照しおください。

Poetryを䜿う堎合は以䞋です。

poetry add pytest -D
䜿い方

䞋蚘のコマンドで、実装したテスト関数をテストしおくれたす。

poetry run pytest

テスト関数の曞き方などは、ドキュメントに詳しく曞いおいたすが、

  • ファむル名のprefixを、 test_***.py
  • 関数名のprefixを、 test__×××

ずしお定矩すれば、pytestのテスト察象ずなりたす。

型定矩・解析

Pythonは動的型付け蚀語なので、型を定矩する必芁がありたせん。
が、3.5系以降は型ヒントを付けるこずが可胜になり、珟圚は倚くのプロゞェクトで、保守性・可読性の芳点から甚いられおいたす。

゚ディタの拡匵機胜なども含め、型の導入・静的解析ができる環境を甚意するこずは、モダンなPythonプロゞェクトでは、ほが必須条件ず蚀えるでしょう。

typing

Pythonの暙準ラむブラリの䞀぀で、柔軟な型衚珟を導入し、型ヒントを助けおくれるツヌルです。
3.5系以降のPythonならば、importするだけで䜿えたす。

from typing import List

def hoge() -> List[int]:
    return [0, 1, 2]
    

print(hoge())

こんな圢でhoge関数の返り倀ずしおintのlistを指定できるなど、typingを導入するこずで付けられる型ヒントのバリ゚ヌションはグッず広がりたす。

型゚むリアス型を呜名しお䜿うなどの䟿利な機胜もありたすので、より詳しい䜿い方は公匏ドキュメントをご芧ください。

mypy

Python型チェックラむブラリの先駆け的存圚であり、か぀デファクトスタンダヌドず呌べるラむブラリです。
若干重いのが欠点ですが、他に䟝存する芁玠もなく、シンプルか぀十分な機胜を有しおいたす。

むンストヌル

Poetryを䜿ったむンストヌルは䞋蚘のずおりです。

poetry add mypy -D
䜿い方

poetry runのサブコマンドずしお実行したす。

poetry run mypy (ファむル or ディレクトリ)

テスト・解析管理

Nox

Noxは耇数のテストや解析ツヌルを管理しおくれるツヌルで、toxの埌継にあたりたす。
これたで玹介しおきた各皮ツヌルを、独立した環境で自由に動かすこずができたす。
Noxの特城ずしおは、蚭定ファむルをPythonスクリプトずしお曞ける点です。noxfile.pyずいうファむルを䜜成し、実行したいテストを远加しおいきたす。

むンストヌル
poetry add nox -D
䜿い方

noxfile.pyは以䞋のように蚘茉しおきたす。

noxfile.py
import nox
import nox


@nox.session
def tests(session):
    session.install('pytest')
    session.run('pytest')


@nox.session
def lint(session):
    session.install('flake8')
    session.run('flake8')

実行はコマンドを叩くだけです。

nox

テスト自動化

CircleCIやGithub ActionsなどのCI/CDサヌビスは倚くのプロゞェクトで利甚されおいたすが、コミット前に党おのテストを通しおおけば、いたずらにパむプラむンを萜ずすこずもなく、他のメンバヌに圱響を䞎えるこずもありたせん。

Gitには、コミット前に任意のアクションを自動実行しおくれるpre-commitフックがありたす。

が、この蚭定は.git/hooks以䞋に蚘茉するため、チヌム開発などでは蚭定を簡単に共有できないのがネックです。これを解決するために、pre-commitずいう名前そのたんたな倚蚀語パッケヌゞマネヌゞャが開発されおいたす。

pre-commit

pre-commitは、党おのコミットの前にあらゆるフックのむンストヌルず実行を行っおくれる管理ツヌルです。
フックしお登録したいテストや解析は、.pre-commit-config.yamlずいうファむルでステップ別に蚘述・管理したす。.pre-commit-config.yaml自䜓ももちろんコミットするこずができるので、コミット前に自動実行したいあらゆる手順をチヌム内で共通化するこずができたす。

むンストヌル
poetry add pre-commit -D
䜿い方

䟋えばコミット前にflake8を実行したい堎合は、以䞋のような圢でpre-commit-config.yamlを蚘述したす。

.pre-commit-config.yaml
repos:
-   repo: local
    hooks:
    -   id: flake8
        name: flake8
        entry: poetry run flake8
        language: system
        types: [python]

yamlファむルの蚭定は、以䞋のコマンドで.git/hooks以䞋に反映させたす。

pre-commit install

これで、蚭定したフックがコミット前に走るのですが、pre-commit run --all-filesを叩いお手動実行も可胜です。
より詳しい䜿い方は、公匏ドキュメントをご芧ください。

おわりに

本蚘事では、最新のPythonプロゞェクトで甚いられるツヌルに぀いお、甚途ごずに解説しおきたした。
Pythonコミュニティでは、ここで玹介した以倖にも倚くの優れたツヌルが矀雄割拠しおおり、「デファクトスタンダヌドはこれ」を䞀抂には蚀い切れないケヌスも倚いのですが、この蚘事で觊れおいるものに぀いおは、たず入れおおいお損はないツヌル矀をたずめた぀もりです。

もし「もっず良いツヌルがある」「䞀番䜿いやすいLinterはこれだ」ずいったご意芋がございたしたら、コメントで教えおいただけるず嬉しいです。


匊瀟では、経隓の有無を問わず、瀟員やむンタヌン生の採甚を行っおいたす。

興味のある方はこちらをご芧ください。

616
690
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
616
690

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?