Virtual environment yang telah kita buat masih kosong, dan keluhan paling sering di dunia data engineering adalah kalimat “di komputer saya jalan”. Akar masalahnya hampir selalu sama: pustaka yang dipakai tidak dicatat dengan versi yang jelas, sehingga lingkungan lain tidak dapat menyusun kombinasi yang sama. Chapter ini membahas cara mendeklarasikan dependensi lewat berkas requirements.txt, menyelaraskan lingkungan dengan pip freeze, dan membaca penentu versi (version specifier) yang benar.
Mendeklarasikan Dependensi dengan requirements.txt #
Berkas requirements.txt berisi daftar pustaka yang dibutuhkan proyek, satu paket per baris. Berkas tersebut disimpan di akar proyek dan dibaca oleh perintah pip install -r. Kita mulai dari contoh paling sederhana, satu pustaka murni Python bernama idna:
idnaLalu kita pasang seluruh isi daftar tersebut ke dalam venv:
venv-demo/bin/pip install -r requirements.txtOutput yang Dihasilkan:
Collecting idna (from -r requirements.txt (line 1))
Using cached idna-3.20-py3-none-any.whl.metadata (7.2 kB)
Using cached idna-3.20-py3-none-any.whl (69 kB)
Installing collected packages: idna
Successfully installed idna-3.20pip membaca berkas tersebut baris demi baris, mengunduh idna versi 3.20 dari PyPI, lalu memasangnya ke folder site-packages milik venv. Setelah proses selesai, pustaka siap diimpor oleh kode pipeline kita.
Menyelaraskan Lingkungan dengan pip freeze #
Perintah pip freeze mencetak seluruh paket terpasang beserta versi persisnya dalam format yang siap dipakai kembali sebagai requirements.txt. Perhatikan perbedaannya dengan pip list:
venv-demo/bin/pip freeze
venv-demo/bin/pip listOutput yang Dihasilkan:
idna==3.20
Package Version
------- -------
idna 3.20
pip 25.0.1Output pip freeze sengaja hanya berisi idna==3.20 dalam format nama==versi — format yang dapat langsung dibaca pip install -r. Alur kerja umumnya: pasang pustaka sambil mengembangkan, lalu bekukan hasilnya dengan pip freeze > requirements.txt agar rekan kerja dan server CI memasang kombinasi versi yang identik.
Untuk proyek data engineering yang sesungguhnya, berkas tersebut biasanya lebih panjang dan memuat pustaka inti dengan versi terkunci, misalnya:
duckdb==1.5.6
pandas==2.2.3
pyarrow==26.0.0
requestsMembaca Penentu Versi #
Tidak semua baris di requirements.txt harus memakai versi persis. pip mengenali beberapa penentu versi dengan arti yang berbeda:
| Penentu | Arti | Contoh |
|---|---|---|
== | versi persis, paling ketat | idna==3.20 |
>= | versi minimum ke atas tanpa batas | idna>=3.10 |
~= | kompatibel dalam seri minor yang sama | idna~=3.10 |
^ | tidak dikenali pip | gaya penulisan Poetry/uv |
Penentu ~= sering disalahpahami: idna~=3.10 mengizinkan pembaruan ke 3.20, tetapi menolak lompatan ke 4.0. Berbeda dengan itu, tanda sisipan ^ yang populer di ekosistem lain justru bukan sintaks pip. Bila kita mencobanya, pip menolak dengan galat:
venv-demo/bin/pip install 'idna^3.0'Output yang Dihasilkan:
ERROR: Invalid requirement: 'idna^3.0': Expected end or semicolon (after name and no valid version specifier)
idna^3.0
^Untuk pipeline yang dijadwalkan berjalan otomatis setiap hari, praktik paling aman adalah mengunci seluruh dependensi dengan == hasil pip freeze, lalu meningkatkan versi secara sengaja lewat proses review — bukan menunggu pembaruan tak terduga dari PyPI.
Alat Modern: uv dan Poetry #
pip bukan satu-satunya pilihan. Dua alat yang banyak dipakai industri:
- uv: pengelola paket dan proyek dari Astral yang dikenal sangat cepat karena ditulis dalam Rust; mampu menggantikan pip, pip-tools, sekaligus mengelola venv dalam satu perintah. Dokumentasi resmi: https://docs.astral.sh/uv/ .
- Poetry: pengelola dependensi sekaligus alat build yang menyimpan deklarasi di
pyproject.tomldan menghasilkan berkas kunci (lock file) untuk reproduksi pasti. Situs resmi: https://python-poetry.org/ .
Keduanya memakai penentu gaya ^ secara bawaan, sehingga penting memahami perbedaannya dari sintaks pip sebelum berpindah alat. Rujukan lengkap pip tersedia di https://pip.pypa.io/en/stable/
.
Dependensi Python kini terkelola rapi. Selanjutnya kita memasang komponen yang menjadi tujuan akhir pipeline: database, dibahas pada chapter Instalasi Database.