Hai, Coders! đ Apakah kamu seorang Python Developer yang ingin mengelola dependensi proyek dengan lebih mudah? Kalau iya, kamu berada di artikel yang tepat! Melalui artikel ini, kita akan bahas tuntas cara proyek Python bisa terbebas dari masalah dependensi dan terkelola dengan rapi. Yuk, langsung saja kita mulai pembahasannya!
Mengelola Dependensi dalam Proyek Python
Tahukah kamu bahwa dependensi yang kita gunakan dalam proyek Python dicatat dalam berkas requirements.txt. Mengapa berkas ini penting? Supaya siapa pun yang mau menjalankan suatu proyeknya kembali, cukup menginstal dependensi yang tertera dalam berkas tersebut.
Bayangkan kamu memiliki proyek yang tidak dikelola selama berbulan-bulan. Namun, kebutuhan menuntutmu untuk menjalankan proyek itu kembali. Sayangnya, kamu lupa untuk mencatat package dan dependensi yang telah digunakan sebelumnya. Alhasil, kamu mencoba untuk menjalankannya dengan versi dependensi yang kamu miliki saat ini.Â
đ» Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar SekarangKamu cukup beruntung jika proyek tersebut masih bisa berjalan sebagaimana mestinya. Jika tidak, error karena konflik dependensi akan terjadi. Kasus seperti ini menjadi pengingat untuk kita akan pentingnya selalu mencatat package dan dependensi yang digunakan dalam suatu proyek secara spesifik.
Lantas, bagaimana cara mengelola dependensi proyek dengan mudah? Mari kita bahas langkahnya satu per satu.
Mulai dengan Membuat Virtual Environment
Untuk mengelola dependensi proyek Python, langkah pertama yang wajib dilakukan adalah membuat virtual environment. Apa itu virtual environment? Virtual environment adalah lingkungan terisolasi yang memungkinkan kita menginstal dependensi tanpa memengaruhi sistem Python utama di komputer kita. Ini sangat membantu untuk menghindari konflik antara proyek yang berbeda.
Ada beberapa tools sederhana yang bisa kamu gunakan untuk membuat virtual environment dengan Python, antara lain:
- Menggunakan virtualenv
Merupakan package yang dirancang khusus untuk membuat virtual environment terisolasi di dalam Python. Cara penggunaannya adalah seperti berikut:
12345678# abaikan jika sudah terinstalpip install virtualenv# membuat virtual environmentvirtualenv <nama_env># mengaktifkan virtual environmentsource <nama_env>/bin/activate - Menggunakan venv
Merupakan versi subset dari virtualenv sehingga venv memiliki beberapa keterbatasan, yaitu lebih lambat pembuatannya, tidak dapat diperbarui dengan pip, dan lain sebagainya. Untuk lebih lengkapnya dapat kamu simak pada dokumentasi berikut.
Package ini sudah tersedia sebagai bawaan sejak Python versi 3.3, sehingga tidak memerlukan instalasi package tambahan. Cara penggunaannya adalah seperti berikut:
12345# membuat virtual environmentpython -m venv <nama_env># mengaktifkan virtual environmentsource <nama_env>/bin/activate - Menggunakan pipenv
Merupakan package untuk mengelola environment dan dependensi proyek Python dengan lebih mudah dan modern. Package ini akan menggunakan berkas yang bernama Pipfile dan Pipfile.lock ketika menginstal dependensi, layaknya package.json dan package-lock.json pada environment Node.js. Cara penggunaannya adalah seperti berikut:
12345678# abaikan jika sudah terinstalpip install pipenv# membuat virtual environmentpipenv install# mengaktifkan virtual environmentpipenv shell
Mencatat Dependensi yang Digunakan
Anggap saja kita sudah membuat virtual environment dan menyelesaikan proyek di dalamnya secara terisolasi. Selanjutnya adalah mencatat seluruh package dan dependensi yang digunakan ke dalam berkas yang bernama requirements.txt. Langkah yang paling umum dan sering orang gunakan untuk menghasilkan berkas tersebut adalah dengan perintah berikut.
1 |
pip freeze > requirements.txt |
Catatan: Perintah ini akan mencantumkan semua package dan dependensi yang terinstal pada environment.
Dari penjelasan singkat di atas, kamu mungkin mulai bertanya, apakah langkah tersebut terbilang efektif? Hm, mari kita bahas!
Dilemanya Penggunaan Pip Freeze
Ketika kita menginstal suatu package, package lain yang menjadi dependensinya akan ikut terinstal. Misalnya, ketika kita menginstal package pandas dengan versi 2.2.2, akan muncul output seperti berikut.
Yup, tidak hanya package pandas saja yang terinstal, melainkan juga package yang menjadi dependensinya seperti numpy, python-dateutil, hingga tzdata. Ketika kita menjalankan perintah
pip freeze , dihasilkan output seperti berikut.
Oke, nampaknya masih baik-baik saja. Itu karena kita menginstal seluruh package tersebut di dalam sebuah virtual environment. Bayangkan jika kita melewatkan langkah tersebut, hasil output yang tampil kemungkinan berisikan beberapa package yang tidak relevan dengan proyek yang dikerjakan sekarang. Hal ini terjadi karena pip freeze akan selalu mengambil package yang berada dalam environment-nya. Akibat tidak ditemukannya environment yang terisolasi maka ia akan mengambil seluruh package yang berada dalam environment global yang kita miliki.
pip freeze juga hanya mendeteksi seluruh package yang terinstal dengan perintah pip install . Jadi, ia tidak akan mendeteksi package yang diinstal menggunakan package installer lainnya, seperti poetry, setuptools, conda, dan lain sebagainya.
Tidak hanya itu, masih ada masalah lain yang mungkin saja terjadi. Mari ambil contoh penginstalan package pandas==2.2.2 sebelumnya. Jika sewaktu-waktu terjadi deprecated pada salah satu method yang dimiliki atau ada pengoptimalan dari package tersebut yang menuntut kita untuk segera memperbarui versinya, bisa jadi terdapat perubahan dependensi di dalamnya.Â
Seperti sebelumnya, ia akan tetap secara otomatis menginstal seluruh dependensi yang diperlukan. Hanya saja, bagaimana dengan dependensi sebelumnya yang sudah tidak terpakai? Kita memang bisa menghapusnya secara manual supaya tidak tercatat ketika menggunakan perintah pip freeze. Untuk proyek skala kecil mungkin masih terbilang minim effort untuk menghapusnya satu per satu, tetapi bisa dibayangkan jika proyek yang dikerjakan berada di skala menengah ke atas, misalnya memiliki lebih dari 20 package. Itupun kalau kita menyadari apa saja daftar package yang sudah tidak relevan untuk dihapus.
Catatan: Penggunaan perintah requirements  dengan pipenv sebagai virtual environment bisa membantu mencatat seluruh package yang digunakan berdasarkan berkas Pipfile.lock. Hanya saja, hasil yang tercatat hampir serupa dengan penggunaan pip freeze.
Dari permasalahan di atas, kita dapat menyadari bahwa penggunaan pip freeze dalam mengelola dependensi proyek dapat dikatakan kurang baik. Oleh karena itu, bagaimana jika kita mencatatnya secara manual? Tentu hal tersebut membutuhkan effort waktu yang tidak sedikit. Jadi, kita akan mencoba alternatif yang lebih baik.
Penggunaan Package Pipreqs
Kita akan mencoba menggunakan sebuah package yang bernama pipreqs. Package ini bekerja hanya dengan mencatat package yang digunakan dalam kode proyek, jadi tolak ukurnya adalah mencatat package apa saja yang diimpor pada proyek. Dengan demikian, ia tidak akan mencatat dependensi dari package-package tersebut.
Dengan menggunakan package pipreqs, kita sudah berhasil mengatasi permasalahan yang mungkin terjadi ketika menggunakan pip freeze. Lalu, bagaimana cara menggunakannya? Sangat mudah, kamu bisa mengikuti opsi-opsi yang tertera pada dokumentasi resminya, atau memahami rangkuman perintah berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# abaikan jika sudah terinstal pip install pipreqs # penggunaan secara umum pipreqs [options] [<path>] # tambahkan opsi --force jika sudah terdapat berkas requirements.txt pipreqs --force # tambahkan opsi --print jika hanya ingin menampilkan sebagai output # tanpa menghasilkan berkas requirements.txt pipreqs --print # tambahkan opsi --scan-notebooks supaya bisa mendeteksi .ipynb # tanpa option ini, tidak akan mendeteksi berkas notebook pipreqs --scan-notebooks # tambahkan opsi --ignore <dirs> supaya package melewatkan pengecekan # pada direktori terkait pipreqs --ignore env # tambahkan path untuk mengatur lingkup pengecekan yang dilakukan pipreqs "/content/drive/MyDrive/Colab Notebooks/" |
Ingatlah bahwa rangkuman perintah di atas hanya sebagai gambaran saja, kamu bisa memadukan beberapa opsi sekaligus bersamaan dengan penggunaan path. Silakan disesuaikan dengan kebutuhan proyek masing-masing.
Walaupun mudah untuk digunakan, ternyata masih ada beberapa bug yang mungkin akan sering dijumpai dalam penggunaannya. Berikut beberapa bug dan solusi penanganannya.
- Gagal mendeteksi versi package yang terinstal secara lokal.
Salah satu bug yang sering dijumpai adalah kegagalan package ini dalam mendeteksi versi package yang terinstal secara lokal. Hal ini dianggap sebagai bug karena kegagalan yang terjadi hanya dialami sebagian package saja. Alhasil, ia akan mencatat versi package yang gagal terdeteksi dengan versi terbaru yang tersedia dari situs pypi.
Bug ini ditandai dengan kemunculan informasi âWarningâ sebagaimana yang tertera pada output di bawah. Solusi yang dapat kita lakukan sebenarnya juga sudah tertera pada output, yaitu dengan mengecek versi package yang gagal terdeteksi secara manual, menggunakan perintah pip show <nama_package>Â .
- Data package tercatat secara berulang (terduplikasi).
Sebenarnya bug ini hampir selalu terkait dengan bug sebelumnya. Selain berpeluang gagal mendeteksi versi package yang terinstal secara lokal, ia juga berpeluang gagal dalam mendeteksi package yang sudah tercatat sebelumnya. Alhasil, terdapat kemungkinan package yang tercatat secara berulang.
Seperti yang dapat dilihat pada output di bawah, terdapat package yang tercatat secara berulang yaitu Pillow. Solusi yang dapat kita lakukan sebenarnya mirip dengan kasus sebelumnya, yaitu dengan mengecek versi package menggunakan perintah pip show <nama_package>Â . Kemudian hapus package dengan versi yang tidak sesuai dengan hasil perintah tersebut.
- Error âUnicodeDecodeErrorâ ketika menggunakan virtualenv/venv.
Error âUnicodeDecodeError: âutf-8â codec canât decode byte 0xb1â bisa terjadi ketika kita menggunakan virtual environment dengan virtualenv/venv. Hal ini karena package pipreqs mencoba mencatat dependensi yang digunakan dalam direktori environment, tetapi gagal dalam memahami berkas-berkas di dalamnya.
Error ini cukup diatasi dengan mengabaikan direktori environment, mengingat penggunaan direktori tersebut juga tidak memiliki kaitan apa pun dengan berkas requirements.txt. Caranya adalah dengan menambahkan opsi â ââignore <nama_env> ketika menjalankan package tersebut. Hal ini sudah dicontohkan pada rangkuman perintah pipreqs  sebelumnya.
Itulah beberapa bug yang mungkin akan sering kita jumpai dalam penggunaannya. Jika kamu menemukan bug dan solusi lainnya, boleh banget sharing di kolom komentar yah~
Penggunaan Pipreqs dalam Proyek Google Colab
Oke, sekarang kita sudah mengetahui pentingnya untuk selalu menggunakan virtual environment sebagai langkah awal pengerjaan proyek. Kita juga sudah mengetahui kelebihan dari pengelolaan dependensi proyek dengan menggunakan package pipreqs. Sekarang mungkin muncul pertanyaan baru, bagaimana cara menggunakannya dalam proyek Google Colab?
Pertanyaan yang menarik, mari kita bahas!
Awalnya, mungkin kamu berpikir untuk mengunduh proyek Google Colab yang sudah selesai dikerjakan, lalu menjalankan pipreqs secara lokal pada proyek yang diunduh tersebut. Cara ini memang masuk akal, tetapi bukan merupakan praktik yang baik. Sebab, tidak ada jaminan bahwa versi package dan dependensi yang digunakan dalam Google Colab akan sama dengan yang kamu gunakan secara lokal. Ingatlah bahwa sedikit saja perbedaan bisa menyebabkan konflik dependensi.
Jadi, daripada harus melakukan pendekatan seperti itu, lebih baik berfokus untuk mencatat seluruh package yang digunakan langsung melalui proyek Google Colab.Â
Untuk mengawalinya, bukalah salah satu proyek Google Colab yang sudah dikerjakan. Kemudian tambahkan satu sel kode di posisi teratas.Â
Catatan: Sel kode ini bersifat sementara, hanya ditambahkan dan digunakan untuk keperluan pencatatan package yang digunakan saja. Ketika sudah selesai, kamu bebas untuk menghapusnya. Posisinya pun sebenarnya dibebaskan.
Selanjutnya, kita bisa mulai dengan menginstal package pipreqs terlebih dahulu.
1 |
!pip install pipreqs |
Catatan: Tanda ! digunakan untuk mengeksekusi perintah shell atau command line dari dalam sel kode.
Untuk menggunakan package tersebut, kita perlu mengatur path-nya sesuai dengan lokasi proyek yang bersangkutan. Di manakah lokasi proyek Google Colab? Umumnya berada dalam Drive kita, tepatnya dalam direktori âColab Notebooksâ. Untuk bisa mengaksesnya, kita perlu menjalankan kode berikut.
1 2 |
from google.colab import drive drive.mount('/content/drive') |
Setelah menjalankan kode tersebut, kamu perlu memilih akun Google yang kamu gunakan dalam pengerjaan proyek dengan Google Colab dan mengizinkan seluruh aksesnya. Setelah berhasil, akan muncul akses ke direktori Drive pada sidebar dari Google Colab yang nampak seperti gambar berikut.
Kamu bisa membuka hirarkinya dan memastikan bahwa proyek tersebut berada di dalamnya.
Setelah memastikan proyek Google Colab tersebut berada dalam Drive, kita bisa memisahkannya dengan proyek lain (jika memiliki lebih dari 1 proyek). Tujuannya, tentu supaya pencatatan yang dilakukan spesifik kepada proyek yang sedang dikerjakan saja. Sebagai contoh mari kita buat direktori bernama âDemoâ dan memindahkan proyek yang sedang dikerjakan ke dalamnya.
Terakhir kita cukup âCopy pathâ dari berkas yang bersangkutan dan menggunakan nilai path tersebut ke dalam implementasi pipreqs. Ingat, kamu bebas mengombinasikan opsi apa pun sesuai dengan kebutuhanmu.
1 |
!pipreqs "/content/drive/MyDrive/Colab Notebooks/Demo" --scan-notebooks |
Perintah di atas akan menghasilkan berkas requirements.txt sesuai dengan path yang tertera.
Kesimpulan
Mengelola dependensi proyek Python memang bisa menjadi tantangan tersendiri, terutama jika kita tidak menggunakan pendekatan yang tepat. Dengan menggunakan virtual environment dan package pipreqs, proses ini menjadi jauh lebih mudah dan terstruktur. Ingatlah untuk selalu mencatat dependensi yang digunakan agar proyekmu mudah dikelola dan dijalankan kembali di masa mendatang.
Semoga artikel ini membantu kamu dalam mengelola dependensi proyek Python dengan lebih baik. Jika ada pertanyaan atau pengalaman yang ingin dibagikan, jangan ragu untuk meninggalkan komentar di bawah. Selamat mencoba, Coders! đ