Virtual Environment #

Saat kamu menginstal paket Python secara global, semua proyek di komputermu berbagi instalasi yang sama. Ini berarti jika Proyek A butuh requests==2.28 dan Proyek B butuh requests==2.31, keduanya tidak bisa koeksis di environment yang sama — salah satu akan rusak. Virtual environment memecahkan masalah ini dengan membuat lingkungan Python yang terisolasi per proyek — interpreter, pip, dan semua paket tersimpan dalam direktori proyek dan tidak mempengaruhi instalasi global maupun proyek lain. Di artikel ini kita bahas semua yang perlu kamu tahu: dari venv bawaan, manajemen dependensi yang baik, hingga uv sebagai tool modern yang jauh lebih cepat.

Mengapa Virtual Environment Diperlukan #

Bayangkan kamu punya dua proyek Python secara bersamaan:

Tanpa virtual environment:

Komputer
└── Python Global
    └── site-packages/
        ├── django==3.2     ← Proyek A butuh ini
        ├── django==4.2     ← Proyek B butuh ini (konflik!)
        └── requests==2.28

Hanya satu versi bisa terinstal → salah satu proyek pasti rusak.
Dengan virtual environment:

Komputer
├── ProyekA/
│   └── .venv/
│       └── site-packages/
│           └── django==3.2   ← terisolasi untuk Proyek A
└── ProyekB/
    └── .venv/
        └── site-packages/
            └── django==4.2   ← terisolasi untuk Proyek B

Keduanya berjalan tanpa konflik.

venv — Virtual Environment Bawaan Python #

venv sudah tersedia di Python 3.3+ tanpa perlu install apapun:

# Buat virtual environment di folder .venv (nama konvensi modern)
python -m venv .venv

# Atau dengan nama lain
python -m venv env
python -m venv venv

Struktur Direktori yang Dibuat #

proyek/
├── .venv/
│   ├── bin/                    # macOS/Linux
│   │   ├── python              # symlink ke Python
│   │   ├── python3
│   │   ├── pip
│   │   └── activate            # skrip aktivasi
│   ├── Scripts/                # Windows
│   │   ├── python.exe
│   │   ├── pip.exe
│   │   └── activate.bat
│   ├── lib/
│   │   └── python3.12/
│   │       └── site-packages/  # paket terinstal di sini
│   └── pyvenv.cfg             # konfigurasi venv
├── src/
│   └── main.py
└── requirements.txt

Mengaktifkan dan Menonaktifkan #

# === Aktivasi ===

# macOS / Linux
source .venv/bin/activate

# Windows (Command Prompt)
.venv\Scripts\activate.bat

# Windows (PowerShell)
.venv\Scripts\Activate.ps1

# Setelah aktivasi, prompt berubah:
# (.venv) user@komputer:~/proyek$

# Verifikasi — pastikan Python menunjuk ke .venv
which python        # macOS/Linux → /path/ke/proyek/.venv/bin/python
where python        # Windows     → C:\...\proyek\.venv\Scripts\python.exe

# === Deaktivasi ===
deactivate
Nama .venv (dengan titik di depan) adalah konvensi yang direkomendasikan PEP 8 dan dikenali otomatis oleh banyak editor (VS Code, PyCharm) serta tool seperti uv. Nama venv atau env juga umum digunakan.

Mengelola Paket dengan pip #

Dengan virtual environment aktif, semua operasi pip terjadi di dalam .venv:

# Install paket
pip install requests
pip install "django>=4.2,<5.0"   # dengan batasan versi
pip install flask==3.0.0          # versi spesifik

# Install beberapa paket sekaligus
pip install fastapi uvicorn pydantic

# Upgrade paket
pip install --upgrade requests
pip install -U pip                # upgrade pip itu sendiri

# Uninstall paket
pip uninstall requests
pip uninstall requests django -y  # -y untuk skip konfirmasi

# Lihat semua paket terinstal
pip list
pip list --outdated               # paket yang ada versi lebih baru

# Info detail satu paket
pip show requests

# Cari paket di PyPI
pip search "http client"          # (mungkin tidak tersedia di beberapa versi)

requirements.txt — Mendokumentasikan Dependensi #

File requirements.txt mendokumentasikan semua paket yang dibutuhkan proyek sehingga developer lain bisa mereproduksi environment yang sama:

# Generate dari environment aktif
pip freeze > requirements.txt

# Install dari requirements.txt
pip install -r requirements.txt

Isi requirements.txt yang Dihasilkan pip freeze #

# requirements.txt (hasil pip freeze)
certifi==2024.2.2
charset-normalizer==3.3.2
idna==3.6
requests==2.31.0
urllib3==2.2.1

pip freeze menyertakan semua paket termasuk dependensi transitif dengan versi yang di-pin secara eksak. Ini bagus untuk reproducibility tapi membuat file besar dan sulit dipelihara secara manual.

Memisahkan requirements.txt per Environment #

Praktik yang lebih baik adalah memisahkan dependensi berdasarkan tujuan:

proyek/
├── requirements/
│   ├── base.txt      ← dependensi inti yang selalu dibutuhkan
│   ├── dev.txt       ← tools development (pytest, black, mypy)
│   └── prod.txt      ← dependensi produksi (gunicorn, sentry-sdk)
└── requirements.txt  ← opsional: shortcut ke base.txt
# requirements/base.txt
fastapi==0.110.0
pydantic==2.6.3
sqlalchemy==2.0.28
# requirements/dev.txt
-r base.txt          # sertakan base.txt
pytest==8.1.1
pytest-asyncio==0.23.5
black==24.2.0
mypy==1.9.0
ruff==0.3.2
# requirements/prod.txt
-r base.txt
gunicorn==21.2.0
sentry-sdk==1.43.0
# Install untuk development
pip install -r requirements/dev.txt

# Install untuk production
pip install -r requirements/prod.txt

pip-tools — Manajemen Dependensi yang Lebih Baik #

pip-tools memisahkan antara dependensi yang kamu tentukan (*.in) dan hasil resolusi lengkap (*.txt), sehingga lebih mudah dipelihara:

pip install pip-tools
# requirements.in — hanya dependensi langsung yang kamu butuhkan
fastapi
pydantic>=2.0
sqlalchemy
# Generate requirements.txt dari requirements.in
pip-compile requirements.in
# → menghasilkan requirements.txt dengan semua dependensi transitif ter-pin

# Update semua dependensi ke versi terbaru
pip-compile --upgrade requirements.in

# Sync environment dengan requirements.txt (install + hapus yang tidak perlu)
pip-sync requirements.txt

Output requirements.in ke requirements.txt:

# requirements.txt (dihasilkan pip-compile)
#
# This file is autogenerated by pip-compile with Python 3.12
# Do not edit this file directly!
# Run pip-compile to regenerate.
#
anyio==4.3.0
    # via starlette
fastapi==0.110.0
    # via -r requirements.in
...

uv — Tool Modern yang Sangat Cepat #

uv adalah package manager Python terbaru yang ditulis dalam Rust — 10–100x lebih cepat dari pip untuk instalasi paket. Ia menggantikan pip, pip-tools, dan virtualenv sekaligus:

# Install uv
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# Atau via pip
pip install uv
# Buat virtual environment
uv venv                         # buat .venv dengan Python default
uv venv --python 3.12           # versi Python spesifik

# Install paket (tanpa aktivasi sekalipun!)
uv pip install requests
uv pip install -r requirements.txt

# Buat proyek baru dengan pyproject.toml
uv init nama-proyek
cd nama-proyek

# Tambah dependensi (update pyproject.toml otomatis)
uv add fastapi
uv add --dev pytest black mypy   # dev dependency

# Hapus dependensi
uv remove requests

# Sync environment dengan pyproject.toml
uv sync

# Jalankan skrip dalam environment proyek (tanpa aktivasi manual)
uv run python main.py
uv run pytest
Perbandingan kecepatan (install 100 paket):

pip              → ~45 detik
pip + cache      → ~8 detik
uv               → ~0.5 detik   ← ~100x lebih cepat dari pip
uv menggunakan format pyproject.toml sebagai sumber kebenaran untuk dependensi — ini adalah standar modern Python (PEP 517/518/621) yang lebih terstruktur dari requirements.txt. Untuk proyek baru, sangat disarankan menggunakan uv dari awal.

pyproject.toml — Standar Modern Konfigurasi Proyek #

pyproject.toml adalah file konfigurasi terpadu untuk proyek Python modern yang menggantikan setup.py, setup.cfg, dan requirements.txt:

# pyproject.toml
[project]
name = "sistem-kasir"
version = "1.0.0"
description = "Sistem kasir berbasis Python"
requires-python = ">=3.11"

dependencies = [
    "fastapi>=0.110.0",
    "pydantic>=2.0",
    "sqlalchemy>=2.0",
    "python-dotenv>=1.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=8.0",
    "black>=24.0",
    "mypy>=1.9",
    "ruff>=0.3",
]

[tool.black]
line-length = 88
target-version = ["py311"]

[tool.mypy]
python_version = "3.11"
strict = true

[tool.ruff]
line-length = 88

pipenv — Alternatif All-in-One #

pipenv menggabungkan virtual environment dan manajemen dependensi dalam satu tool:

pip install pipenv

# Buat environment dan install paket
pipenv install requests
pipenv install pytest --dev      # dev dependency

# Aktivasi shell dalam environment
pipenv shell

# Jalankan perintah tanpa aktivasi
pipenv run python main.py
pipenv run pytest

# Generate requirements.txt dari Pipfile.lock
pipenv requirements > requirements.txt

Pipenv menggunakan dua file: Pipfile (dependensi yang kamu tentukan) dan Pipfile.lock (versi ter-pin untuk reproducibility).

# Pipfile (dikelola otomatis oleh pipenv)
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"
fastapi = ">=0.110"

[dev-packages]
pytest = "*"
black = "*"

[requires]
python_version = "3.12"

.gitignore untuk Virtual Environment #

Virtual environment tidak boleh di-commit ke git — ukurannya besar dan berisi binary yang platform-specific:

# .gitignore
# Virtual environment
.venv/
venv/
env/
ENV/

# pip
*.egg-info/
dist/
build/
*.egg

# pyc files
__pycache__/
*.py[cod]
*$py.class
*.pyo

# Environment variables
.env
.env.local
.env.*.local

# IDE
.idea/
.vscode/
*.swp
Jangan pernah commit direktori .venv/ atau venv/ ke repository. Ukurannya bisa ratusan MB dan berisi binary yang tidak portabel antar sistem operasi. Commit requirements.txt atau pyproject.toml saja — ini yang dibutuhkan developer lain untuk mereproduksi environment.

Workflow Lengkap Proyek Baru #

Menggunakan venv + pip (Tradisional) #

# 1. Buat direktori proyek
mkdir proyek-saya && cd proyek-saya

# 2. Buat virtual environment
python -m venv .venv

# 3. Aktifkan
source .venv/bin/activate          # macOS/Linux
# atau: .venv\Scripts\activate     # Windows

# 4. Upgrade pip
pip install --upgrade pip

# 5. Install dependensi
pip install fastapi uvicorn pydantic

# 6. Catat dependensi
pip freeze > requirements.txt

# 7. Buat .gitignore
echo ".venv/" >> .gitignore

# 8. Mulai coding...

Menggunakan uv (Modern — Direkomendasikan) #

# 1. Buat proyek baru
uv init proyek-saya && cd proyek-saya

# 2. Tambah dependensi
uv add fastapi uvicorn pydantic

# 3. Tambah dev dependencies
uv add --dev pytest black mypy ruff

# 4. Sync environment (otomatis buat .venv jika belum ada)
uv sync

# 5. Jalankan kode
uv run python src/main.py

# 6. Buat .gitignore
echo ".venv/" >> .gitignore

Meng-clone Proyek yang Sudah Ada #

# Clone repository
git clone https://github.com/user/proyek.git
cd proyek

# === Jika proyek pakai requirements.txt ===
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# === Jika proyek pakai pyproject.toml + uv ===
uv sync

# === Jika proyek pakai Pipfile ===
pipenv install

Troubleshooting Masalah Umum #

# Masalah 1: "python" tidak ditemukan setelah aktivasi
# Coba: python3 bukan python
python3 -m venv .venv
source .venv/bin/activate
python3 --version

# Masalah 2: PowerShell menolak eksekusi skrip (Windows)
# Jalankan sebagai admin:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Lalu coba lagi: .venv\Scripts\Activate.ps1

# Masalah 3: "pip: command not found" setelah aktivasi di Ubuntu
# Install python3-venv dulu
sudo apt install python3-venv python3-pip -y
python3 -m venv .venv

# Masalah 4: VS Code tidak mendeteksi virtual environment
# Tekan Ctrl+Shift+P → "Python: Select Interpreter"
# Pilih path ke .venv/bin/python

# Masalah 5: Package terinstal tapi tidak bisa diimport
# Pastikan virtual environment aktif saat menjalankan kode
which python      # harus menunjuk ke .venv, bukan Python global
pip show requests # verifikasi paket memang terinstal di venv ini

Perbandingan Tool Virtual Environment #

Tool          │ Kelebihan                          │ Kekurangan
──────────────┼────────────────────────────────────┼───────────────────────────
venv (bawaan) │ Tidak perlu install, selalu ada    │ Hanya virtual environment
pip           │ Standar, semua orang tahu           │ Lambat, tidak lock otomatis
pip-tools     │ Pemisahan .in dan .txt yang bersih │ Perlu install tambahan
pipenv        │ All-in-one, Pipfile lebih readable  │ Lambat, kadang buggy
uv            │ Sangat cepat (Rust), modern         │ Tool baru, ekosistem berkembang
conda         │ Bagus untuk data science, non-Python│ Ukuran besar, overhead tinggi

Ringkasan #

  • Selalu buat virtual environment untuk setiap proyek — bahkan untuk proyek kecil sekalipun. Jangan install paket ke Python global.
  • Gunakan .venv sebagai nama — konvensi modern yang dikenali editor dan tool secara otomatis.
  • Jangan commit .venv/ ke git — hanya commit requirements.txt atau pyproject.toml yang berisi daftar dependensi.
  • uv adalah pilihan terbaik untuk proyek baru — 100x lebih cepat dari pip, mengelola venv + dependensi sekaligus, dan menggunakan pyproject.toml standar modern.
  • pip freeze > requirements.txt membekukan semua versi secara eksak — bagus untuk reproducibility tapi sulit dipelihara. Pertimbangkan pip-tools untuk proyek yang lebih besar.
  • Pisahkan requirements.txt per environment (base, dev, prod) agar tidak menginstal dev tools di production.
  • pyproject.toml adalah standar modern yang menggantikan setup.py dan requirements.txt — gunakan ini untuk proyek baru.
  • Verifikasi environment aktif dengan which python (macOS/Linux) atau where python (Windows) sebelum install atau menjalankan kode.

← Sebelumnya: Regex   Berikutnya: Keyword →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact