Pythonのvenv(仮想環境)とは

Pythonで開発をしていると、プロジェクトごとに異なるライブラリやバージョンが必要になることがよくあります。たとえば、あるプロジェクトでは「requestsの旧バージョン」、別のプロジェクトでは「最新バージョン」を使う必要があるといったケースです。このような状況で、同じ環境にすべてのパッケージをインストールしてしまうと、依存関係の衝突が発生し、プログラムが正常に動作しなくなる可能性があります。

この問題を解決するために用意されているのが、「venv(仮想環境)」です。venvとは、Pythonの標準機能として提供されている仮想環境の仕組みであり、プロジェクトごとに独立した実行環境を作成することができます。これにより、それぞれのプロジェクトが互いに影響を与えることなく、必要なライブラリや設定を自由に管理できるようになります。


venvの仕組み

venvを使うと、特定のディレクトリ内に独立したPython環境が構築されます。この環境には以下のような要素が含まれます。

  • 専用のPython実行ファイル
  • 専用のpip(パッケージ管理ツール)
  • ライブラリ保存用のディレクトリ

つまり、仮想環境の中では「その環境専用のPython」が動いている状態になります。これにより、グローバル環境(システム全体)とは完全に分離された状態で開発を進めることができます。


venvを使うメリット

まず第一に、依存関係の衝突を防げることです。プロジェクトごとに必要なライブラリとそのバージョンを個別に管理できるため、異なるプロジェクト同士で影響し合うことがありません。

第二に、環境の再現性が高まることです。requirements.txtなどを使って依存関係を管理することで、別のマシンやサーバーでも同じ環境を簡単に再現できます。これはチーム開発や本番環境へのデプロイで非常に重要です。

第三に、システム環境を汚さないことです。グローバル環境に不要なライブラリをインストールする必要がなくなり、システム全体をクリーンに保つことができます。

1. Python 3.9 をインストール

[root@aquila ~]# sudo dnf install python39 -y

2. venv モジュールが無い場合に備えて(環境によって必要)

[root@aquila ~]# sudo dnf install python39-pip -y

3. 仮想環境作成

[root@aquila ~]# python3.9 -m venv /opt/ai

4. pip を最新版にアップグレード

[root@aquila ~]# /opt/ai/bin/pip install --upgrade pip

5. 必要パッケージをインストール

[root@aquila ~]# /opt/ai/bin/pip install requests beautifulsoup4 google-generativeai

6. 仮想環境を有効化

[root@aquila ~]# source /opt/ai/bin/activate

7. APIキー設定

(ai) [root@aquila ~]# export GEMINI_API_KEY="xxxx"

While working on a project, a Python programmer is always looking for libraries and modules that can make his coding part or testing part easy. Most programmers tend to use “pip” to install packages in Python.

Yes! “pip” works fantastically. But, sometimes when you are working on two different projects. You might require two different versions of the same library in these projects. When you install a Python library using “pip”, those packages are installed globally on your machine. It means there can only be one single version of that library across all the programs.

And, that’s where venv or a virtual environment comes as a savior. But, what is it?

A virtual environment aka virtualenv or venv is a Python environment but an isolated one. Just like a virtual machine running on your computer! So, to install all the different dependencies separated by the project, you must install your packages using venv.

Linux用 本格AI開発環境テンプレ(Python + venv)

~/ai-project/
├── venv/                 # 仮想環境
├── app/
   ├── main.py           # エントリーポイント
   ├── config.py         # 設定管理
   ├── llm.py            # AI処理
   ├── utils.py          # 共通処理
   └── prompts/          # プロンプト管理
├── data/                 # データ
├── logs/                 # ログ
├── tests/                # テスト
├── requirements.txt
├── .env                  # APIキーなど
└── run.sh                # 実行スクリプト

全体構成

# プロジェクト作成
mkdir -p ~/ai-project && cd ~/ai-project

# 仮想環境
python3.9 -m venv venv
source venv/bin/activate

# 基本ライブラリ
pip install --upgrade pip
pip install \
  requests \
  beautifulsoup4 \
  python-dotenv \
  google-generativeai \
  openai \
  fastapi \
  uvicorn \
  pandas \
  numpy \
  loguru
``

① 環境構築

requests
beautifulsoup4
python-dotenv

② requirements.txt

GEMINI_API_KEY=xxxx
OPENAI_API_KEY=xxxx
APP_ENV=dev

③ 環境変数管理(.env)

import os
from dotenv import load_dotenv

load_dotenv()

class Config:
    GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    ENV = os.getenv("APP_ENV", "dev")

config = Config()

④ config.py

import google.generativeai as genai
from app.config import config

genai.configure(api_key=config.GEMINI_API_KEY)

def ask_gemini(prompt: str) -> str:
    model = genai.GenerativeModel("gemini-pro")
    response = model.generate_content(prompt)
    return response.text

⑤ LLM処理(llm.py)

app/prompts/summary.txt

以下を要約してください:

{input_text}

⑥ プロンプト管理

# app/main.py
from app.llm import ask_gemini
from app.utils import load_prompt

def main():
    text = "Pythonはとても便利なプログラミング言語です..."
    prompt = load_prompt("summary.txt").format(input_text=text)

    result = ask_gemini(prompt)
    print(result)

if __name__ == "__main__":
    main()

⑧ メイン処理

# app/api.py
from fastapi import FastAPI
from app.llm import ask_gemini

app = FastAPI()

@app.get("/")
def root():
    return {"status": "ok"}

@app.post("/ask")
def ask(prompt: str):
    return {"response": ask_gemini(prompt)}

起動
uvicorn app.api:app --host 0.0.0.0 --port 8000

⑨ API化(FastAPI)

# run.sh
#!/bin/bash
source venv/bin/activate
python -m app.main
``

chmod +x run.sh
./run.sh
``

⑩ 実行スクリプト