PR
PR

【Pythonの学習 Day1】Ubuntu 24.04 LTSで作る、Python + pyenv + uv で始めるモダン開発環境

記事内に広告が含まれています。

以前、pythonをAIに教えてもらいながら勉強しようとして勉強を始めたのですが、ちょっと仕事が忙しくなって挫折してしまいました...

ですが、あれからAIがすごく進化したのとGeminiに課金を行ったので、Geminiを先生としてpythonの勉強を再開することにしました。

Gemini先生に以下のように聞いて、教えてもらった内容を実際にやってみてその結果をまとめてみました。

Ubuntu24.04でPythonの開発を行う際におすすめの環境を教えてください。
フレームワークはflaskを使用したいです。

まずは開発環境を構築したい

まず最初にUbuntu24.04とPythonで開発環境は何がおすすめなのかをGemini先生に聞いたところ、「Python + pyenv + uv」をおすすめされたので、教えに従い環境を構築していくことにしました。

「pyenv」と「uv」はそれぞれ以下の役割を果たしてくれるそうです。

  • pyenv: 複数の Python バージョンを簡単にインストールし、プロジェクトごとに切り替えるための必須ツール。
  • uv: Rust 製の超高速な Python パッケージングツールで、仮想環境の作成からパッケージのインストールまでを爆速でこなします。

この2つを組み合わせることで、「使いたいPythonのバージョンは「pyenv」で柔軟に選び、その上で動くプロジェクトのパッケージ管理と仮想環境は「uv」で超高速かつ快適に行う」という、まさにいいとこ取りの開発フローが実現できるそうです。

pyenv

Python のバージョン管理ツールで、システムに複数の異なるバージョンの Python (例: 3.9, 3.10, 3.11, 3.12 など) を共存させることができます。

プロジェクト単位で「このプロジェクトでは Python 3.10 を使う」「あちらのプロジェクトでは Python 3.12 を使う」といった切り替えを簡単に行えるようにします。

これにより、プロジェクト単位での「Python のバージョン違いによるエラー」から解放されます。

uv

Astral社によって開発されている、Rust製のPythonパッケージングツールです。

「venv」のように仮想環境を作成する機能と、「pip」のようにパッケージをインストール・管理する機能を持ち合わせています。

依存関係の解決やパッケージのダウンロード・インストールが非常に高速で、開発中の待ち時間を大幅に削減してくれます。

pyenvのインストールと設定

Pythonのバージョン管理を行うために必要な、「pyenv」をインストールします。

はじめに、「pyenv」がPythonをソースからビルドする際に必要なライブラリをあらかじめインストールしておきます。

$ sudo apt update
$ sudo apt install -y build-essential libbz2-dev libdb-dev \
libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
libncursesw5-dev libsqlite3-dev libssl-dev \
zlib1g-dev uuid-dev tk-dev

tk-devはtkinterを使ったGUIアプリケーションを実行する場合に必要となります。

GUIを持たない環境にインストールする場合は不要となります。

pyenv のインストール

pyenv のインストールには、公式が推奨しているインストーラーを使うのが簡単です。

以下のコマンドを実行すると、「pyenv」といくつかの便利なプラグイン (pyenv-virtualenv など) を一緒にインストールしてくれます。

$ curl https://pyenv.run | bash

「~/.bashrc」に「pyenv」用設定を追記

「pyenv」をbashで正しく動作させるために、「~/.bashrc」に「pyenv」用の設定を追記します。

$ cp -p ~/.bashrc ~/.bashrc_$(date "+%Y%m%d_%H%M%S")
$ vi ~/.bashrc

追加する内容は以下のとおりです。

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)"

設定を追加したら、ターミナルを再起動するか、以下のコマンドで設定の再読み込みを行います。

$ source ~/.bashrc

インストール確認

ターミナルで「pyenv --version」を実行し、バージョン番号が表示されればインストール成功です。

$ pyenv --version
pyenv 2.5.7

「pyenv」を使って使いたいバージョンの「Python」をインストール

「pyenv」の準備ができたので、次は開発に使用したいPythonのバージョンをインストールします。

インストール可能なPythonバージョンは以下のコマンドで確認できます。(多くのバージョンが表示されるはずです)

$ pyenv install --list

pythonのインストールは「pyenv install」で行います。

$ pyenv install pythonバージョン

ここでは例として、比較的新しく安定している「Python 3.13.3」 (2025年5月時点での最新安定版の一つ) をインストールすることにします。

この処理はソースコードをダウンロードしてからPythonをビルドするため、少し時間がかかります。

$ pyenv install 3.13.3
Downloading Python-3.13.3.tar.xz...
-> https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz
Installing Python-3.13.3...
Installed Python-3.13.3 to /home/tamohiko/.pyenv/versions/3.13.3

Pythonは「~/.pyenv/versions/」ディレクトリの中にインストールされます。

$ ls -l ~/.pyenv/versions/
total 4
drwxr-xr-x 6 tamohiko tamohiko 4096 May 11 21:16 3.13.3

インストールされているPythonのバージョンを確認

「pyenv versions」コマンドで、現在インストールされているPythonバージョンの確認を行います。

$ pyenv versions
* system (set by /home/tamohiko/.pyenv/version)
  3.13.3

system (システムに元から入っているPython) と、今インストールしたPythonのバージョンが表示されるはずです。

「*」がついているものが、現在使用するように選択されているPythonになります。

使用するPythonのバージョンを設定

「pyenv」を使うと、ユーザがデフォルトとして使うPythonのバージョン (global) と、特定のディレクトリ内だけで使うPythonのバージョン (local)を設定することができます。

global設定

「pyenv global」コマンドで「pyenv」をインストールしたユーザが、デフォルトで使用するPythonのバージョンを設定することができます。

さきほどインストールしたバージョン3.13.3を使用するように設定をしてみます。

$ pyenv global 3.13.3

実際にバージョンを確認してみると、「Python 3.13.3」が使用されていることが確認できました。

$ python --version
Python 3.13.3

システムに元から入っているPythonを使用したい場合は、「pyenv global」でsystemを指定します。

$ pyenv global system

「pyenv versions」で確認すると、「system」が選択されていることが確認できます。

$ pyenv versions
* system (set by /home/tamohiko/.pyenv/version)
  3.13.3

systemにインストールされているPythonを使用する場合は「python3」とする必要があるので、以下のようにコマンドを実行することでバージョンを確認します。

$ python3 --version
Python 3.12.3

systemにインストールされているPythonを使用する場合に「python3」と実行する理由

「python --version」を実行すると、「python: command not found」と表示されてしまいます。

$ python --version
pyenv: python: command not found

The `python' command exists in these Python versions:
  3.13.3

Note: See 'pyenv help global' for tips on allowing both
      python2 and python3 to be found.

これは、pythonコマンドが「Python 2」という古いバージョンを指すことが多かったのですが、Python 2 は2020年に公式サポートが終了して、今は「Python 3」が主流となっています。

「Python 2」と「Python 3」の違いによる混乱を避けるために、Ubuntuを含む多くのLinuxディストリビューションでは、「Python 3」を使うときは「python3」コマンドを使うように促しているためです。

「pyenv」でインストールしたPythonは「python」で実行できます

「pyenv」を初期化すると、「(pyenv root)/shims」というディレクトリが環境変数「PATH」の最前面に追加されます。

$ env | grep PATH
PATH=/home/tamohiko/.pyenv/shims:/home/tamohiko/.pyenv/bin:/home/tamohiko/.volta/bin:/home/tamohiko/.volta/bin:/home/tamohiko/.volta/bin:/home/tamohiko/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin

この「shims」ディレクトリには、python, pip, python3 など、Python に関連する主要なコマンドと同じ名前の 実行ファイル(shim)が格納されています。

$ ls -la 
total 72
drwxrwxr-x  2 tamohiko tamohiko 4096 May 12 08:49 .
drwxrwxr-x 14 tamohiko tamohiko 4096 May 12 09:10 ..
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 idle
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 idle3
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 idle3.13
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 pip
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 pip3
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 pip3.13
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 pydoc
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 pydoc3
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 pydoc3.13
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 python
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 python-config
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 python3
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 python3-config
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 python3.13
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 python3.13-config
-rwxrwxr-x  1 tamohiko tamohiko  186 May 11 21:17 python3.13-gdb.py

これらのshimは、実際のPython インタープリタや関連ツールではありません。

shimは、実行されるとまず「pyenv」を呼び出し、「現在どのバージョンの Python を使うべきか?」を判断させます。

「pyenv」は、以下の優先順位でどのバージョンのPythonを使用するかを決定します。

  1. PYENV_VERSION 環境変数: この環境変数が設定されていれば、その値で指定されたバージョンが最優先されます。
  2. .python-version ファイル: カレントディレクトリ、または親ディレクトリを遡って見つかった .python-version ファイルに書かれているバージョンが使用されます。(pyenv local コマンドで作成・編集できます)
  3. $(pyenv root)/version ファイル: 上記のいずれも見つからない場合、グローバル設定ファイル (pyenv global コマンドで設定) に書かれているバージョンが使用されます。
  4. system: 上記のいずれも設定されていない場合、システムに元々インストールされている Python が使用されます。

ターミナルで python と入力すると、以下の流れで処理が進みます。

  1. シェルは PATH 環境変数を先頭から順に検索し、実行するコマンドを探します。
  2. $(pyenv root)/shimsがPATHの最前面にあるため、まず $(pyenv root)/shims/python が見つかります。
  3. shims/pythonが実行されます。
  4. shims/pythonは「pyenv」を呼び出し、環境変数、.python-version ファイルなどを参照し、どのPythonバージョンを使うべきかを決定します。
  5. 「pyenv」は決定したバージョンの実際のPythonインタープリタ(例: $(pyenv root)/versions/3.13.3/bin/python)を特定します。
  6. 「pyenv」は特定した実際のPythonを実行します。

つまり、pythonと入力したコマンドはshimsを経由して、「pyenv」がその時点で選択しているバージョンのPythonに最終的に渡されるのです。

pythonとpython3

shimsディレクトリにはpythonだけでなくpython3という名前のshimも通常存在します。

そのため、「pyenv」で管理しているPythonのバージョンが3系であれば、pythonコマンドでもpython3コマンドでも、同じバージョンのPythonが実行されることになります。

これにより、システムにデフォルトで用意されているpythonやpython3コマンドを意識することなく、「pyenv」で指定したバージョンのPythonを一貫してpythonコマンドで利用できます。

local設定

local設定は特定のプロジェクトで使用するPythonのバージョンを「pvenv local バージョン」コマンドで設定します。

これは、プロジェクトのディレクトリに移動してから実行します。

今回は例として、ユーザのホームディレクトリに「project/first_project」というディレクトリを作成して、そこで使用するPythonのバージョンを指定してみます。

$ mkdir -p ~/project/first_project
$ cd ~/project/first_project
$ pyenv local 3.13.3

この設定を行うと、ディレクトリ内に「.python-version」というファイルが作成されて、そこに使用するPythonのバージョン情報が記録されます。

$ ls -la
合計 12
drwxrwxr-x 2 tamohiko tamohiko 4096  5月 12 09:26 .
drwxrwxr-x 6 tamohiko tamohiko 4096  5月 12 09:25 ..
-rw-rw-r-- 1 tamohiko tamohiko    7  5月 12 09:26 .python-version
$ cat .python-version 
3.13.3

「pyenv versions」を実行して、使用されるPythonのバージョンを確認してみると、「3.13.3」のところに「*」があるので、このバージョンが使用されるように設定されていることが確認できます。

$ pyenv versions
  system
* 3.13.3 (set by /home/tamohiko/project/first_project/.python-version)

今回設定したPythonのバージョン3.13.3 は「pyenv」を使ってインストールしているので、「python」コマンドを実行しても「pyenv: python: command not found」とならないので、「python --version」を実行してPythonのバージョンを確認することができます。

$ python --version
Python 3.13.3

uvのインストール

次に、高速パッケージングツール「uv」をインストールします。

「uv」も公式のインストールスクリプトを使うと簡単にインストールすることができます。

$ curl -LsSf https://astral.sh/uv/install.sh | sh
downloading uv 0.7.3 x86_64-unknown-linux-gnu
no checksums to verify
installing to /home/tamohiko/.local/bin
  uv
  uvx
everything's installed!

「~/.bashrc」ファイルの再読み込み

インストール後、「uv」コマンドが使えるようにターミナルを再起動するか、「source」コマンドで「~/.bashrc」ファイルを再読み込みします。

$ source ~/.bashrc

ターミナルで uv --version を実行し、バージョン番号が表示されれば成功です。

$ uv --version
uv 0.7.3

プロジェクトのセットアップ

いよいよ「pyenv」と「uv」を組み合わせてプロジェクトを開始します!

プロジェクトで使用するディレクトリ作成

新しいプロジェクト用のディレクトリとして「~/project/test_project」を作成しそこに移動します。

$ mkdir ~/project/test_project
$ cd ~/project/test_project

プロジェクトで使用するPythonのバージョン指定

このプロジェクトで使用するPythonのバージョンを「pyenv」で3.13.3と指定します。

$ pyenv local 3.13.3

これで、このディレクトリ内ではPythonのバージョン3.13.3が使われるようになります。

「uv」による仮想環境の作成

「uv venv」コマンドを使って、このプロジェクト専用の仮想環境を作成します。

$ uv venv
Using CPython 3.13.3 interpreter at: /home/tamohiko/.pyenv/versions/3.13.3/bin/python3.13
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

コマンドを実行すると、仮想環境で使用する「.venv」という名前のディレクトリが作られます。

$ ls -la
合計 16
drwxrwxr-x 3 tamohiko tamohiko 4096  5月 12 16:10 .
drwxrwxr-x 7 tamohiko tamohiko 4096  5月 12 16:01 ..
-rw-rw-r-- 1 tamohiko tamohiko    7  5月 12 16:08 .python-version
drwxrwxr-x 4 tamohiko tamohiko 4096  5月 12 16:10 .venv

仮想環境のアクティベート(有効化)

「source .venv/bin/activate」コマンドを実行して、作成した仮想環境を有効化します。

仮想環境が有効になると、プロンプトの先頭に()で囲まれた仮想環境名が表示されるようになります。

$ source .venv/bin/activate
(test_project) tamohiko@ホスト名:~/project/test_project $ 

「uv」によるパッケージのインストール

次に、必要なパッケージやライブラリを「uv pip install」 でインストールしましょう。

例えば、人気のWebフレームワーク「Flask」をインストールしてみます。

$ uv pip install Flask
Resolved 7 packages in 478ms
Prepared 7 packages in 231ms
Installed 7 packages in 22ms
 + blinker==1.9.0
 + click==8.2.0
 + flask==3.1.0
 + itsdangerous==2.2.0
 + jinja2==3.1.6
 + markupsafe==3.0.2
 + werkzeug==3.1.3

Geminiからは、設定情報をファイルから読み込むのに便利な「python-dotenv」もおすすめされたので合わせてインストールしてみます。

$ uv pip install python-dotenv
Resolved 1 package in 223ms
Prepared 1 package in 42ms
Installed 1 package in 7ms
 + python-dotenv==1.1.0

パッケージの確認と依存関係の保存

インストールされているパッケージの一覧は uv pip list で確認できます。

$ uv pip list
Package       Version
------------- -------
blinker       1.9.0
click         8.2.0
flask         3.1.0
itsdangerous  2.2.0
jinja2        3.1.6
markupsafe    3.0.2
python-dotenv 1.1.0
werkzeug      3.1.3

プロジェクトの依存関係を「requirements.txt」に保存するには、以下のコマンドを実行します。

このファイルがあれば、他の環境で「uv pip install -r requirements.txt」を使って同じ環境を簡単に再現できます。

$ uv pip freeze > requirements.txt

こんな感じに依存関係が「requirements.txt」に記録されます。

$ cat requirements.txt 
blinker==1.9.0
click==8.2.0
flask==3.1.0
itsdangerous==2.2.0
jinja2==3.1.6
markupsafe==3.0.2
python-dotenv==1.1.0
werkzeug==3.1.3

簡単なFlaskアプリ(Gemini作成)を作って動かしてみる

今回構築した環境でGeminiが作成してくれたアプリを動かしてみます。

Gemini先生が作成してくれたスクリプトを「app.py」というファイルを作成します。

$ vi main.py

内容は以下のとおりです。


# app.py
from flask import Flask
import os
from dotenv import load_dotenv # python-dotenv を使う場合

load_dotenv() # .envファイルがあれば読み込む

app = Flask(__name__)

# 環境変数からメッセージを取得(なければデフォルト)
greeting = os.environ.get("GREETING", "Hello")

@app.route('/')
def hello_world():
    return f'{greeting}, World from Flask with pyenv + uv!'

# このファイルが直接実行された場合のみ、開発用サーバーを起動
if __name__ == '__main__':
    # debug=True にすると、コードを変更した時に自動で再起動して便利!
    # 本番環境では False にすること。
    app.run(debug=True, host='0.0.0.0', port=5000)

Flaskサーバ起動

「Flask」には開発用の簡易サーバーが内蔵されているので、ターミナルで「flask run」コマンドを実行し起動させてみます。

$ flask run
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

これで、Webブラウザから「http://127.0.0.1:5000」にアクセスすると、「Hello, World from Flask with pyenv + uv!」と表示されることを確認できました。

Flaskサーバ停止

Flaskの開発サーバーを止めるには、ターミナルで Ctrl + C を押します

仮想環境のディアクティベート(無効化)

「$ source .venv/bin/activate」で有効化した仮想環境を無効化する場合は「deactivate」コマンドを実行します。

仮想環境が無効化されると、プロンプトの先頭にある()で囲まれた仮想環境名が表示されなくなります。

(test_project) tamohiko@ホスト名:~/project/test_project $ deactivate
tamohiko@ホスト名:~/project/test_project $ 

今日のまとめ

開発環境は簡単に構築できた

Pythonの勉強をGemini先生に教えてもらい、改めて一から始めることにしましたが、環境構築までは非常にスムーズに完了しました。

開発環境でよく使われているものとして、「pyenv」と「venv」を組み合わせた構成も一般的なようですが、今回はGemini先生におすすめの「pyenv」と「uv」を組み合わせた環境で勉強をしていこうと思います。

今後の方針

書籍を見ながらプログラムの勉強をすると、途中で挫折してしまうことが多かったように思います…

原因を考えてみると、特に作りたいものがないまま漠然と勉強していたため、モチベーションが続かなかったのではないかと思います。

そこで今回は、まず作りたいものを具体的に設定し、それを完成させることを目標として学習に取り組んでいこうと思います。

また、私には完璧主義なところがあるようで、プログラムも、最初から他者に見られても非の打ち所がないような完璧なものを作ろうと意気込んでしまい、その結果、何が最善なのか判断できなくなり、途中で断念してしまうことも多かったように感じます。

まるで問題集や参考書の最初の数ページだけは一生懸命になるけれど、結局最後までやり遂げられないタイプなのでしょう。

ですから今回は、ソースコードの体裁は後回しにしてでも、まずはプログラムを動作させることを最優先の目標とし、無事に完成させた後に、徐々に問題点を改善していくという進め方で取り組んでいこうと思います。

何と言っても、今回は何を何回質問しても決して怒らないGemini先生がついていてくれるので、本当に心強いです!

コメント

タイトルとURLをコピーしました