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:
numpy==2.1.3
pandas==2.2.3
matplotlib==3.9.2
scikit-learn==1.5.2Tanda == 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:
pip freeze > requirements.txtOutput yang Dihasilkan (isi berkas pada venv yang baru memasang empat library inti):
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.1Daftar 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:
pip install -r requirements.txtpip membaca berkas tersebut, lalu memasang setiap barisnya beserta turunannya hingga lingkungan kembali utuh. Mari kita bedah tiga keputusan di balik pola kerja ini:
pip freeze > requirements.txt:pip freezemencetak daftar paket terpasang dalam formatnama==versi; tanda>mengarahkan keluarannya menjadi berkas alih-alih layar.pip install -r requirements.txt: flag-r(requirements) memerintahkan pip membaca daftar paket dari sebuah berkas, lalu memasang semuanya.- Dua gaya daftar: daftar manual minimalis hanya memuat dependensi langsung dan mudah dibaca manusia; hasil
freezememuat 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:
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:
numpy==2.1.3
pandas==2.2.3
matplotlib==3.9.2
scikit-learn==1.5.2Mari kita bedah skrip di atas:
- Baris 1 (
from importlib.metadata import version): memuat fungsiversion()dari standard library; fungsi ini membaca metadata paket terpasang di lingkungan aktif. - Baris 3 (
dependensi_langsung): daftar paket yang kode kita impor sendiri — satu-satunya yang perlu kita rawat secara sadar. - Baris 5-6 (
for ... version(lib)): tiap nama pakai formatnama==versipersis seperti barisrequirements.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:
| Penulisan | Arti bagi pip | Kapan dipakai |
|---|---|---|
pandas==2.2.3 | Wajib persis 2.2.3 | Proyek analisis dan aplikasi yang perlu stabil serta teruji |
pandas>=2.2,<3.0 | Boleh 2.2 ke atas, tetapi di bawah 3.0 | Library publik yang memberi ruang bagi penggunanya |
pandas | Versi apa pun yang tersedia | Prototipe 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:
from importlib.metadata import requires
for ketentuan in requires("pandas"):
if "extra ==" not in ketentuan:
print(ketentuan)Output yang Dihasilkan:
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.7Mari kita baca keluaran tersebut dengan teliti:
- Enam baris ketentuan: pandas menyatakan kebutuhannya — numpy dengan batas versi tertentu, lalu
python-dateutil,pytz, dantzdata. Inilah calon dependensi transitif yang ikut terpasang saat kita memasang pandas. - 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, ketentuannumpy>=1.26.0yang berlaku. - Baris
extra ==yang disaring: kondisiifpada 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 #
- Dokumentasi pip
— rujukan resmi untuk
pip freeze,pip install -r, dan format requirements. - Python Packaging User Guide — panduan komunitas seputar pengelolaan dependensi proyek.
- Dokumentasi uv — pengenal resmi alat alternatif modern dari Astral.
Rangkuman #
requirements.txtmencatat library proyek agar lingkungan dapat dibangun ulang di komputer mana pun denganpip install -r requirements.txt.pip freeze > requirements.txtmembekukan seluruh isi venv; daftar manual minimalis hanya memuat dependensi langsung dengan versi terkuncinama==versi.pandas==2.2.3mengunci 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.
uvadalah alternatif modern yang cepat untuk pip dan venv; opsional, karena polavenv+pip+requirements.txttetap 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.