Dataset kita kini terdokumentasi lengkap, dan janji di akhir chapter Dokumentasi Dataset
menagih satu syarat terakhir: rekan yang membacanya juga harus bisa menjalankan kodenya — dengan versi pustaka yang sama seperti saat analisis dibuat. Tanpa pengelolaan yang disengaja, syarat itu berubah menjadi keluhan klasik: “di laptop saya jalan, kok di sini gagal?”. Kegagalannya bermacam-macam: import pandas yang berhenti karena pustaka tidak terpasang, sampai kasus yang lebih sulit terlihat — kode berjalan tetapi hasilnya bergeser karena versi pustaka berbeda. Bab ini mempraktikkan satu putaran utuh: membuat lingkungan terisolasi, memasang versi terkunci, membekukan daftarnya ke requirements.txt, memeriksa kecocokannya tanpa jaringan, lalu membungkus pemeriksaan itu menjadi uji pytest.
Masalah “Di Laptop Saya Jalan” #
Akar masalahnya sederhana: lingkungan pustaka hanya hidup di satu komputer. Folder .venv dibuat per proyek, tetapi seluruh isinya melekat pada mesin tempat folder itu dibuat — dokumentasi resmi venv pun menyatakan lingkungan tidak dimaksudkan untuk dipindahkan antar sistem. Sementara itu, pip install pandas tanpa nomor versi memasang versi terbaru saat perintah dijalankan, sehingga pembangunan ulang di komputer lain bisa menghasilkan kombinasi pustaka yang belum pernah kita uji — dan hasil dari kombinasi tak teruji bukan lagi hasil yang sama.
Dasar-dasarnya sudah kita kenal: chapter Virtual Environment
menjelaskan mengapa tiap proyek perlu lingkungan sendiri, dan chapter Manajemen Dependensi
memperkenalkan requirements.txt serta dua gaya penulisannya. Pada bab ini keduanya dirangkai menjadi kebiasaan alur kerja: satu putaran perintah setiap memulai proyek, dan satu pemeriksaan setiap menerima proyek. Tabel berikut merangkum gejalanya ketika pengelolaan ini diabaikan.
| Gejala di lapangan | Akar masalahnya | Penawarnya |
|---|---|---|
import pandas gagal di komputer rekan | pustaka hanya terpasang di lingkungan laptop kita | requirements.txt dipasang ulang dengan pip install -r |
| Kode jalan, tetapi hasilnya berbeda | versi pustaka berbeda sehingga perilaku bergeser | versi terkunci nama==versi |
| Dua proyek saling menimpa di satu mesin | keduanya memasang ke site-packages global | satu lingkungan terisolasi per proyek |
Satu Putaran Perintah: Buat, Aktifkan, Pasang, Bekukan #
Kita praktikkan pada proyek analisis Toko Kopi Kita. Enam perintah berikut adalah putaran lengkap pembekuan lingkungan; hanya hasil akhirnya — berkas requirements.txt — yang perlu berpindah ke komputer lain.
cd proyek-toko-kopi
python3 -m venv .venv # 1. buat lingkungan terisolasi
source .venv/bin/activate # 2. aktifkan (Windows: .venv\Scripts\Activate.ps1)
pip install pandas==2.2.3 scikit-learn==1.5.2 # 3. pasang versi terkunci
pip install pytest # 4. alat uji ikut tercatat sebagai dependensi
pip freeze > requirements.txt # 5. bekukan seluruh isi lingkungan
deactivate # 6. keluar; folder .venv tetap utuhMari kita bedah tiap perintahnya:
- Perintah 1-2 (
venvdanactivate):python3 -m venv .venvmembuat folder lingkungan berisisite-packageskosong;source .venv/bin/activatemengalihkanpythondanpipdi terminal menunjuk ke isi folder itu, ditandai awalan(.venv)pada prompt. - Perintah 3:
==memastikan yang terpasang persis versi yang kita uji, bukan versi terbaru hari ini. - Perintah 4 (
pip install pytest): alat uji dipasang dengan sengaja agar ikut tercatat — pytest adalah bagian dari proyek, bukan perlengkapan pribadi satu orang. - Perintah 5 (
pip freeze > requirements.txt):pip freezemencetak seluruh paket terpasang dalam formatnama==versi; tanda>mengarahkan keluarannya menjadi berkas alih-alih layar. - Perintah 6 (
deactivate): terminal kembali ke Python global;.venvtetap ada untuk diaktifkan lagi nanti.
Di komputer lain, seluruh lingkungan dipulihkan dengan tiga perintah:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtFlag -r memerintahkan pip membaca daftar paket dari berkas, lalu memasang setiap barisnya persis pada versi yang tertulis. Daftar tertulis, versi terkunci, pembangunan berulang — itulah kontrak yang membuat analisis bisa pindah mesin.
Memeriksa Kecocokan Lingkungan Tanpa Jaringan #
Skenario berikutnya: kita menerima proyek warisan beserta requirements.txt buatan tangan si pembuat — cukup dependensi langsung plus baris komentar, gaya daftar minimalis yang sudah kita kenal. Sebelum menjalankan analisisnya, kita periksa dulu apakah mesin ini memenuhi daftar itu dengan importlib.metadata dari standard library: membaca metadata lokal tanpa unduhan dan tanpa memasang apa pun.
import os
from importlib.metadata import PackageNotFoundError, version
# requirements.txt buatan Budi di laptopnya — kita periksa di mesin ini.
isi_requirements = """\
# Dikunci oleh Budi, 15 Januari 2026
pandas==2.2.3
scikit-learn==1.5.2
numpy==1.26.0
pustaka-fiktif==0.1.0
"""
with open("requirements.txt", "w", encoding="utf-8") as berkas:
berkas.write(isi_requirements)
with open("requirements.txt", encoding="utf-8") as berkas:
for baris in berkas:
baris = baris.strip()
if not baris or baris.startswith("#"):
continue # lewati baris kosong dan baris komentar
nama, versi_beku = baris.split("==")
try:
versi_ini = version(nama)
except PackageNotFoundError:
print(f"{nama:15s} TIDAK TERPASANG")
continue
status = "cocok" if versi_ini == versi_beku else f"beda versi ({versi_ini})"
print(f"{nama:15s} {status}")
os.remove("requirements.txt")Output yang Dihasilkan:
pandas cocok
scikit-learn cocok
numpy beda versi (2.1.3)
pustaka-fiktif TIDAK TERPASANGMari kita bedah cara kerjanya:
isi_requirements = ...: berkas empat baris ditulis lebih dulu agar contoh ini mandiri; pada proyek nyata,requirements.txtsudah ada di folder proyek. Baris komentar dan baris kosong disertakan karena berkas nyata memuatnya.if not baris or baris.startswith("#"): pembaca yang tahan banting — baris kosong dan komentar dilewati, bukan diperlakukan sebagai nama paket.baris.split("=="): memisahkan nama paket dari versi yang dikunci pada tiap baris.version(nama)denganexcept PackageNotFoundError:importlib.metadata.version()membaca versi paket dari metadata lokal di lingkungan aktif. Bila paket tidak ada, pengecualiannya ditangkap dan dicatat sebagai TIDAK TERPASANG — bukan dibiarkan menghentikan skrip.
Dua temuan menuntut keputusan. numpy terpasang 2.1.3 sedangkan daftar menuntut 1.26.0 — versi peninggalan laptop lama si pembuat; kita harus memilih memasang versi itu atau menguji ulang analisis pada versi baru. Adapun pustaka-fiktif tidak pernah terpasang; tersangka pertamanya ejaan, karena nama paket di PyPI tidak selalu sama dengan nama modulnya — paketnya bernama scikit-learn, yang kita impor adalah sklearn. Pemeriksaan seperti ini mengubah pertanyaan samar “kenapa tidak jalan?” menjadi daftar jawaban spesifik.
Menjadikan Pemeriksaan sebagai Uji pytest #
Pemeriksaan sekali jalan mudah dilupakan, apalagi saat tenggat laporan menekan. Kebiasaan yang lebih kokoh: bungkus pemeriksaan versi sebagai uji pytest, simpan di folder proyek, dan jalankan setiap kali proyek dibuka. Fungsi ujinya pendek karena cukup memanfaatkan assert:
from importlib.metadata import version
VERSI_TERKUNCI = {
"pandas": "2.2.3",
"scikit-learn": "1.5.2",
}
def test_versi_terkunci():
"Seluruh versi yang dikunci proyek harus terpasang persis."
for nama, versi_beku in VERSI_TERKUNCI.items():
terpasang = version(nama)
assert terpasang == versi_beku, f"{nama} {terpasang}, seharusnya {versi_beku}"Sebagai skrip biasa, blok di atas hanya mendefinisikan fungsi tanpa mencetak apa pun — barisnya baru bekerja ketika pytest menjalankannya. Simpan blok tersebut sebagai test_lingkungan.py di folder proyek, lalu jalankan:
pytest -q test_lingkungan.pyOutput yang Dihasilkan:
. [100%]
1 passed in 0.10sTiga keputusan di balik uji kecil ini:
VERSI_TERKUNCI: satu tempat kebenaran versi proyek; kenaikan versi cukup diedit di satu kamus ini, bukan dicari-cari di banyak berkas.def test_versi_terkunci(): pytest mengumpulkan seluruh fungsi yang namanya berawalantest_— sinyal bagi pytest, bukan kata kunci bahasa.assert terpasang == versi_beku, f"...": bila versi tidak cocok, assertion gagal dan pytest menampilkan pesan setelah koma lengkap dengan kedua versinya. Satu titik pada baris pertama keluaran menandai satu uji lulus;1 passedadalah ringkasannya.
Alat Modern: uv #
Seluruh putaran di atas memakai tiga alat standar — venv, pip, dan requirements.txt — yang pasti ada di instalasi Python mana pun. Beberapa tahun belakangan komunitas juga mengenal uv buatan Astral: satu binari pengganti venv dan pip sekaligus yang memasang paket jauh lebih cepat, dan menghasilkan requirements.txt terkunci dari daftar minimalis requirements.in lewat uv pip compile. Perintahnya sengaja dibuat serupa dengan pip:
uv venv .venv # buat lingkungan, senada dengan python3 -m venv
source .venv/bin/activate
uv pip install -r requirements.txt # pulihkan lingkungan dari daftar yang sama
uv pip compile requirements.in -o requirements.txt # kunci daftar minimalis menjadi daftar lengkapUntuk materi ini, pola venv + pip tetap memadai; tidak ada yang wajib berganti alat. uv layak dicoba ketika pemasangan mulai terasa lambat atau ketika proyek butuh penguncian dependensi yang ketat. Apa pun pilihannya, kontraknya tetap sama: daftar dependensi adalah bagian dari proyek dan ikut disimpan bersama kode.
Peta Peran Alat #
Setelah satu putaran penuh, posisi tiap alat menjadi jelas. Tabel berikut dapat dijadikan pengingat cepat — terutama saat membaca dokumentasi proyek orang lain:
| Alat | Perannya dalam pengelolaan dependensi |
|---|---|
venv (standard library) | membuat lingkungan terisolasi, satu per proyek |
pip | memasang paket dan membaca daftar dependensi |
pip freeze | memotret versi seluruh paket terpasang menjadi daftar terkunci |
requirements.txt | daftar tertulis yang ikut disimpan dan dibagikan bersama proyek |
uv | alternatif modern: pengganti venv + pip dengan penguncian bawaan |
pytest | mengubah pemeriksaan lingkungan menjadi uji otomatis yang berulang |
Rangkuman #
- Lingkungan pustaka hanya hidup di satu komputer; yang membuat analisis bisa pindah mesin adalah
requirements.txt, bukan folder.venv. - Satu putaran pembekuan — buat venv, aktifkan, pasang versi terkunci,
pip freeze— dijalankan sekali; di komputer lain cukuppip install -r requirements.txt. importlib.metadatamemeriksa kecocokan versi secara lokal tanpa jaringan; ingat bahwa nama paket PyPI (scikit-learn) bisa berbeda dari nama modulnya (sklearn).- Fungsi berawalan
test_denganassertmembungkus pemeriksaan versi menjadi uji pytest yang berulang. uvmenawarkan putaran yang sama dengan satu alat tunggal; polavenv+piptetap standarnya.
Lingkungan kini terkunci dan pemeriksaannya otomatis — syarat reproduksi terakhir dari chapter Reproducible Analysis terpenuhi. Satu gerbang tersisa sebelum hasil diserahkan kepada pemakai: memastikan angka-angkanya sendiri layak dipercaya. Gerbang itu kita lewati pada chapter penutup Section ini: Pemeriksaan Kualitas Hasil .