Kata-kata “di komputer saya kok jalan?” adalah keluhan klasika dunia pengembangan, dan dunia data science tidak kebal terhadapnya. Virtual environment mengisolasi proyek kita, tetapi isi venv hanya hidup di satu komputer: begitu analisis dipindahkan ke laptop rekan atau server kantor, tidak ada yang mencatat library apa saja beserta versinya yang harus dipasang ulang. Pada chapter ini kita menuntaskan hal tersebut dengan requirements.txt — daftar belanja tertulis untuk proyek — mulai dari membuat, memasang ulang, membedakan versi terkunci dari rentang versi, hingga mengenali dependensi langsung dan transitif. Sekilas kita juga berkenalan dengan uv, alat modern yang kini banyak dipakai sebagai alternatif pip.

Mengapa Daftar Tertulis Itu Wajib #

Mari kita ukur dulu besarnya masalah. Venv yang aktif di komputer kita tahu persis library apa yang terpasang — pip bahkan bisa mendaftarkannya. Tetapi pengetahuan tersebut tidak ikut pindah saat kita menyalin folder proyek, karena folder .venv memang tidak dimaksudkan untuk disalin antar komputer. Tanpa daftar tertulis, membangun ulang lingkungan di komputer baru berarti menebak dari ingatan: library apa, versi berapa, plus seluruh paket pendukungnya. Tekanan terbesar datang dari nomor versi: pip install pandas di bulan ini dan bulan depan bisa menghasilkan versi berbeda, dan perilaku kode kita ikut berubah tanpa satu baris pun disunting.

Membuat dan Memasang requirements.txt #

Berkas requirements.txt adalah daftar paket yang dibaca pip — satu paket per baris. Bentuk paling minimal dan paling mudah dirawat ditulis dengan tangan, berisi hanya yang kita sebut dependensi langsung, yakni library yang benar-benar kita impor di kode:

text
numpy==2.1.3
pandas==2.2.3
matplotlib==3.9.2
scikit-learn==1.5.2

Tanda == membekukan versi: pandas yang terpasang harus persis 2.2.3, bukan yang lain. Dengan begitu komputer mana pun yang memasang daftar ini akan mendapat kombinasi yang sama dengan yang kita uji. Cara lain adalah membekukan otomatis seluruh isi venv:

bash
pip freeze > requirements.txt

Output yang Dihasilkan (isi berkas pada venv yang baru memasang empat library inti):

text
contourpy==1.3.3
cycler==0.12.1
fonttools==4.62.1
joblib==1.5.3
kiwisolver==1.5.0
matplotlib==3.9.2
numpy==2.1.3
packaging==26.0
pandas==2.2.3
pillow==11.3.0
pyparsing==3.3.2
python-dateutil==2.9.0.post0
pytz==2026.1.post1
scikit-learn==1.5.2
scipy==1.14.1
threadpoolctl==3.6.0
tzdata==2026.1

Daftar panjang tersebut adalah isi lengkap venv — termasuk paket yang tidak pernah kita tulis saat instalasi. Di komputer lain, atau di venv baru setelah folder .venv lama terhapus, seluruhnya dipulihkan dengan satu perintah:

bash
pip install -r requirements.txt

pip membaca berkas tersebut, lalu memasang setiap barisnya beserta turunannya hingga lingkungan kembali utuh. Mari kita bedah tiga keputusan di balik pola kerja ini:

  1. pip freeze > requirements.txt: pip freeze mencetak daftar paket terpasang dalam format nama==versi; tanda > mengarahkan keluarannya menjadi berkas alih-alih layar.
  2. pip install -r requirements.txt: flag -r (requirements) memerintahkan pip membaca daftar paket dari sebuah berkas, lalu memasang semuanya.
  3. Dua gaya daftar: daftar manual minimalis hanya memuat dependensi langsung dan mudah dibaca manusia; hasil freeze memuat semuanya dan menghasilkan lingkungan yang identik. Keduanya sah — yang penting konsisten dipakai dan disimpan bersama proyek.

Membangkitkan Daftar Terkunci dari Dalam Python #

Nomor versi terpasang juga dapat ditanyakan langsung dari Python melalui importlib.metadata — tanpa perlu mengimpor library beratnya. Skrip berikut membangkitkan empat baris pertama requirements.txt secara programatis, dan memang kita jalankan nyata di lingkungan pengujian materi ini:

python
from importlib.metadata import version

dependensi_langsung = ["numpy", "pandas", "matplotlib", "scikit-learn"]

for lib in dependensi_langsung:
    print(f"{lib}=={version(lib)}")

Output yang Dihasilkan:

text
numpy==2.1.3
pandas==2.2.3
matplotlib==3.9.2
scikit-learn==1.5.2

Mari kita bedah skrip di atas:

  1. Baris 1 (from importlib.metadata import version): memuat fungsi version() dari standard library; fungsi ini membaca metadata paket terpasang di lingkungan aktif.
  2. Baris 3 (dependensi_langsung): daftar paket yang kode kita impor sendiri — satu-satunya yang perlu kita rawat secara sadar.
  3. Baris 5-6 (for ... version(lib)): tiap nama pakai format nama==versi persis seperti baris requirements.txt. Trik ini berguna saat kita ingin memverifikasi versi di dalam skrip atau notebook tanpa berpindah ke terminal.

Versi Terkunci dan Rentang Versi #

Cara menuliskan versi pada daftar menentukan seberapa bebas pip memilih. Tiga gaya yang perlu kita kenali:

PenulisanArti bagi pipKapan dipakai
pandas==2.2.3Wajib persis 2.2.3Proyek analisis dan aplikasi yang perlu stabil serta teruji
pandas>=2.2,<3.0Boleh 2.2 ke atas, tetapi di bawah 3.0Library publik yang memberi ruang bagi penggunanya
pandasVersi apa pun yang tersediaPrototipe singkat; paling rentan berubah perilaku

Untuk proyek data science yang hasilnya akan dilaporkan, kebijakan terbaik jelas: kunci versinya. Laporan yang ditulis dengan pandas 2.2.3 harus bisa dijalankan ulang bulan depan dengan hasil yang sama — dan == adalah cara termurah untuk menjaminnya.

Dependensi Langsung dan Transitif #

Perbedaan dua istilah ini menjelaskan mengapa daftar freeze tadi jauh lebih panjang dari empat baris kita. Dependensi langsung adalah paket yang kita impor sendiri: numpy, pandas, matplotlib, scikit-learn. Dependensi transitif adalah paket yang dibutuhkan oleh dependensi langsung kita — kita tidak pernah mengimpornya, tetapi tanpa paket tersebut library utama tidak berfungsi. Metadata Requires pada pandas menceritakan hal itu:

python
from importlib.metadata import requires

for ketentuan in requires("pandas"):
    if "extra ==" not in ketentuan:
        print(ketentuan)

Output yang Dihasilkan:

text
numpy>=1.22.4; python_version < "3.11"
numpy>=1.23.2; python_version == "3.11"
numpy>=1.26.0; python_version >= "3.12"
python-dateutil>=2.8.2
pytz>=2020.1
tzdata>=2022.7

Mari kita baca keluaran tersebut dengan teliti:

  1. Enam baris ketentuan: pandas menyatakan kebutuhannya — numpy dengan batas versi tertentu, lalu python-dateutil, pytz, dan tzdata. Inilah calon dependensi transitif yang ikut terpasang saat kita memasang pandas.
  2. Penanda python_version: batas versi numpy berbeda menurut versi Python yang dipakai, karena setiap generasi Python menuntut wheel yang berbeda. Di Python 3.12 kita, ketentuan numpy>=1.26.0 yang berlaku.
  3. Baris extra == yang disaring: kondisi if pada skrip membuang ketentuan opsional — fitur tambahan seperti dukungan format Excel yang tidak kita perlukan untuk pemasangan dasar.

Kesimpulan praktisnya: daftar manual minimalis merawat yang kita ketahui (dependensi langsung), sedangkan pip yang menyelesaikan sisanya (transitif) secara otomatis. Daftar freeze memotret keduanya sekaligus — itulah sebabnya daftar hasil freeze adalah alat terbaik untuk mereplikasi lingkungan secara utuh.

Sekilas tentang uv #

Akhir-akhir ini muncul alat bernama uv buatan Astral yang menjadi perhatian komunitas Python. uv menggantikan sekaligus pip dan venv dalam satu binari tunggal: uv venv membuat lingkungan, uv pip install memasang paket dengan kecepatan yang jauh di atas pip, dan fitur uv pip compile menghasilkan daftar terkunci dari daftar minimalis kita. Bagi kita yang sudah nyaman dengan pola venv + pip + requirements.txt, tidak ada yang wajib berubah — ketiganya tetap standar de facto yang didukung semua tutorial dan server. Namun bila suatu saat instalasi library terasa lambat atau kita butuh penguncian dependensi yang lebih ketat, uv patut dicoba; dokumentasinya lengkap dan perintahnya sengaja dibuat serupa dengan pip.

Referensi Resmi #

Rangkuman #

  • requirements.txt mencatat library proyek agar lingkungan dapat dibangun ulang di komputer mana pun dengan pip install -r requirements.txt.
  • pip freeze > requirements.txt membekukan seluruh isi venv; daftar manual minimalis hanya memuat dependensi langsung dengan versi terkunci nama==versi.
  • pandas==2.2.3 mengunci versi persis; >= dan rentang versi memberi keleluasaan pada harga kestabilan — untuk laporan analisis, kunci versinya.
  • Dependensi langsung adalah yang kita impor; dependensi transitif dibutuhkan oleh dependensi langsung kita dan diselesaikan pip otomatis.
  • uv adalah alternatif modern yang cepat untuk pip dan venv; opsional, karena pola venv + pip + requirements.txt tetap menjadi standar.

Lingkungan kini terdokumentasi dan dapat direplikasi. Satu langkah terakhir menutup Section ini: merangkai folder proyek agar data, notebook, kode, dan dokumen saling menemukan tempatnya — kita susun pada chapter Struktur Proyek Data Science.