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 sepertiuv. Namavenvatauenvjuga 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
uvmenggunakan formatpyproject.tomlsebagai sumber kebenaran untuk dependensi — ini adalah standar modern Python (PEP 517/518/621) yang lebih terstruktur darirequirements.txt. Untuk proyek baru, sangat disarankan menggunakanuvdari 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/atauvenv/ke repository. Ukurannya bisa ratusan MB dan berisi binary yang tidak portabel antar sistem operasi. Commitrequirements.txtataupyproject.tomlsaja — 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
.venvsebagai nama — konvensi modern yang dikenali editor dan tool secara otomatis.- Jangan commit
.venv/ke git — hanya commitrequirements.txtataupyproject.tomlyang berisi daftar dependensi.uvadalah pilihan terbaik untuk proyek baru — 100x lebih cepat dari pip, mengelola venv + dependensi sekaligus, dan menggunakanpyproject.tomlstandar modern.pip freeze > requirements.txtmembekukan semua versi secara eksak — bagus untuk reproducibility tapi sulit dipelihara. Pertimbangkanpip-toolsuntuk proyek yang lebih besar.- Pisahkan
requirements.txtper environment (base, dev, prod) agar tidak menginstal dev tools di production.pyproject.tomladalah standar modern yang menggantikansetup.pydanrequirements.txt— gunakan ini untuk proyek baru.- Verifikasi environment aktif dengan
which python(macOS/Linux) atauwhere python(Windows) sebelum install atau menjalankan kode.