Saya mulai bekerja dengan Python. Saya telah menambahkan requirements.txt
dan setup.py
ke proyek saya. Tapi, saya masih bingung dengan tujuan kedua file tersebut. Saya telah membaca yang setup.py
dirancang untuk hal-hal yang dapat didistribusikan ulang dan yang requirements.txt
dirancang untuk hal-hal yang tidak dapat didistribusikan ulang. Tapi saya tidak yakin ini akurat.
Bagaimana kedua file itu benar-benar dimaksudkan untuk digunakan?
Jawaban:
persyaratan.txt
Ini membantu Anda menyiapkan lingkungan pengembangan Anda. Program seperti
pip
ini dapat digunakan untuk menginstal semua paket yang terdaftar di file dalam satu gerakan. Setelah itu Anda bisa mulai mengembangkan script python Anda. Sangat berguna jika Anda berencana meminta orang lain berkontribusi pada pengembangan atau menggunakan lingkungan virtual. Inilah cara Anda menggunakannya:setup.py
Ini memungkinkan Anda membuat paket yang dapat didistribusikan ulang. Skrip ini dimaksudkan untuk menginstal paket Anda pada sistem pengguna akhir, bukan untuk mempersiapkan lingkungan pengembangan seperti
pip install -r requirements.txt
halnya. Lihat jawaban ini untuk detail lebih lanjut tentang setup.py.Dependensi proyek Anda dicantumkan di kedua file.
sumber
Jawaban singkatnya
requirements.txt
adalah untuk mencantumkan persyaratan paket saja.setup.py
di sisi lain lebih seperti skrip instalasi. Jika Anda tidak berencana memasang kode python, biasanya Anda hanya perlurequirements.txt
.File tersebut
setup.py
menjelaskan, selain dependensi paket, kumpulan file dan modul yang harus dikemas (atau dikompilasi, dalam kasus modul asli (yaitu, ditulis dalam C)), dan metadata untuk ditambahkan ke daftar paket python ( misalnya nama paket, versi paket, deskripsi paket, pembuat, ...).Karena kedua file mencantumkan dependensi, ini dapat menyebabkan sedikit duplikasi. Baca detailnya di bawah.
persyaratan.txt
File ini mencantumkan persyaratan paket python. Ini adalah file teks biasa (opsional dengan komentar) yang mencantumkan dependensi paket proyek python Anda (satu per baris). Ini tidak menjelaskan cara paket python Anda diinstal. Anda biasanya akan menggunakan file persyaratan dengan
pip install -r requirements.txt
.Nama file dari file teks tersebut sewenang-wenang, tetapi sering kali
requirements.txt
berdasarkan konvensi. Saat menjelajahi repositori kode sumber dari paket python lainnya, Anda mungkin tersandung pada nama lain, sepertidev-dependencies.txt
ataudependencies-dev.txt
. Mereka melayani tujuan yang samadependencies.txt
tetapi umumnya mencantumkan dependensi tambahan yang menarik bagi pengembang paket tertentu, yaitu untuk menguji kode sumber (misalnya pytest, pylint, dll.) Sebelum rilis. Pengguna paket umumnya tidak memerlukan seluruh rangkaian dependensi developer untuk menjalankan paket.Jika ada beberapa
requirements-X.txt
varian, biasanya salah satu akan mencantumkan dependensi waktu proses, dan yang lainnya akan mencantumkan dependensi waktu proses, atau menguji dependensi. Beberapa proyek juga menurunkan file persyaratan mereka, yaitu ketika satu file persyaratan menyertakan file lain ( contoh ). Melakukannya dapat mengurangi pengulangan.setup.py
Ini adalah skrip python yang menggunakan
setuptools
modul untuk mendefinisikan paket python (nama, file yang disertakan, metadata paket, dan instalasi). Ini akan, sepertirequirements.txt
, juga mencantumkan dependensi runtime dari paket tersebut. Setuptools adalah cara de-facto untuk membangun dan menginstal paket python, tetapi ia memiliki kekurangan, yang seiring waktu telah menumbuhkan pengembangan "manajer paket meta" baru, seperti pip. Contoh kekurangan dari setuptools adalah ketidakmampuannya untuk menginstal beberapa versi dari paket yang sama, dan kurangnya perintah uninstall.Ketika pengguna python melakukan
pip install ./pkgdir_my_module
(ataupip install my-module
), pip akan berjalansetup.py
di direktori (atau modul) yang diberikan. Demikian pula, modul apa pun yang memiliki asetup.py
dapatpip
diinstal, misalnya dengan menjalankanpip install .
dari folder yang sama.Apakah saya benar-benar membutuhkan keduanya?
Jawaban singkatnya adalah tidak, tapi senang memiliki keduanya. Keduanya mencapai tujuan yang berbeda, tetapi keduanya dapat digunakan untuk membuat daftar dependensi Anda.
Ada satu trik yang dapat Anda pertimbangkan untuk menghindari duplikasi daftar dependensi antara
requirements.txt
dansetup.py
. Jika Anda telah menulis sepenuhnya berfungsisetup.py
untuk paket Anda, dan dependensi Anda sebagian besar eksternal, Anda dapat mempertimbangkan untuk memiliki yang sederhanarequirements.txt
hanya dengan yang berikut:Ini
-e
adalahpip install
opsi khusus yang menginstal paket yang diberikan dalam mode yang dapat diedit . Ketikapip -r requirements.txt
dijalankan pada file ini, pip akan menginstal dependensi Anda melalui daftar di./setup.py
. Opsi yang dapat diedit akan menempatkan symlink di direktori pemasangan Anda (bukan telur atau salinan yang diarsipkan). Ini memungkinkan pengembang untuk mengedit kode dari repositori tanpa menginstal ulang.Anda juga dapat memanfaatkan apa yang disebut "tambahan setuptools" ketika Anda memiliki kedua file dalam repositori paket Anda. Anda dapat mendefinisikan paket opsional di setup.py di bawah kategori khusus, dan menginstal paket itu hanya dari kategori itu dengan pip:
dan kemudian, di file persyaratan:
Ini akan menyimpan semua daftar ketergantungan Anda di dalam setup.py.
Catatan : Anda biasanya akan menjalankan pip dan setup.py dari kotak pasir, seperti yang dibuat dengan program ini
virtualenv
. Ini akan menghindari pemasangan paket python di luar konteks lingkungan pengembangan proyek Anda.sumber
.
w / o-e
dalamrequirements.txt
. Metode ini hanya mendelegasikan semua persyaratan kesetup.py
dan Anda tidak perlu memaksa siapa pun ke mode yang dapat diedit. Pengguna tetap bisa melakukannyapip install -e .
jika mereka mau.-e .
juga menggunakan setup.py untuk menemukan dependensi, tetapi menautkan folder saat ini (di tempat, dengan symlink) di folder instalasi pip, daripada mengambil salinannya - Anda-e
biasanya hanya akan menggunakan jika Anda mengembangkan paket. Dengan-e
, perubahan pada file paket python Anda (* .py) akan segera berlaku di lingkungan pip Anda, daripada harus menginstal ulang paket secara paksa setelah setiap perubahan.cd foo && pip install -r ./bar/requirements.txt
akan mencari setup.py difoo/bar
ataufoo
? Jika yang terakhir, apakah ada cara untuk mencapai yang pertama?pip -r REQ
tidak peduli dengan direktori tempat REQ berada. Anda dapat makan dari fifo bahkan jika Anda ingin:pip install -r <(echo "mylib1"; echo "mylib2";)
. Di mana<(CMD)
substitusi perintah bash, bukan pengalihan stdin.Demi kelengkapan, berikut adalah cara saya melihatnya dalam
34 sudut berbeda.Ini adalah deskripsi tepat yang dikutip dari dokumentasi resmi (penekanan saya):
Namun mungkin masih belum mudah untuk dipahami, sehingga pada bagian selanjutnya, terdapat 2 contoh faktual untuk menunjukkan bagaimana kedua pendekatan tersebut seharusnya digunakan secara berbeda.
Oleh karena itu, penggunaan aktualnya (seharusnya) berbeda
Jika proyek Anda
foo
akan dirilis sebagai pustaka mandiri (artinya, orang lain mungkin akan melakukannyaimport foo
), maka Anda (dan pengguna hilir Anda) ingin memiliki deklarasi ketergantungan yang fleksibel, sehingga pustaka Anda tidak akan (dan tidak boleh ) menjadi "pilih-pilih" tentang versi pasti dari dependensi ANDA yang seharusnya. Jadi, biasanya, setup.py Anda akan berisi baris seperti ini:Jika Anda hanya ingin entah bagaimana "mendokumentasikan" atau "menyematkan" lingkungan Anda saat ini PERSIS untuk aplikasi Anda
bar
, artinya, Anda atau pengguna Anda ingin menggunakan aplikasi Andabar
apa adanya, yaitu berjalanpython bar.py
, Anda mungkin ingin membekukan lingkungan Anda sehingga akan selalu berperilaku sama. Jika demikian, file persyaratan Anda akan terlihat seperti ini:Sebenarnya, mana yang saya gunakan?
Jika Anda mengembangkan aplikasi
bar
yang akan digunakan olehpython bar.py
, meskipun itu "hanya skrip untuk bersenang-senang", Anda tetap disarankan untuk menggunakan persyaratan.txt karena, siapa tahu, minggu depan (yang kebetulan Natal) Anda akan menerima komputer baru sebagai hadiah, jadi Anda perlu mengatur lingkungan persis Anda di sana lagi.Jika Anda mengembangkan pustaka
foo
yang akan digunakan olehimport foo
, Anda harus menyiapkan a setup.py. Titik. Tetapi Anda tetap dapat memilih untuk memberikan persyaratan.txt pada saat yang sama, yang dapat:(a) bisa
A==1.2.3
bergaya (seperti dijelaskan di # 2 di atas);(b) atau hanya berisi single magis
.
yang kira-kira sama dengan "menginstal persyaratan berdasarkan setup.py" sementara tanpa duplikasi. Secara pribadi saya menganggap pendekatan terakhir ini mengaburkan garis, menambah kebingungan dan TIDAK benar-benar menambah nilai, tetapi tetap saja ini adalah trik yang berasal dari pendekatan yang disebutkan oleh pengelola kemasan Python Donald dalam posting blognya .
Batas bawah yang berbeda.
Bahkan setelah Anda mengikuti 3 kriteria di atas dan memutuskan dengan benar bahwa library Anda
hybrid-engine
akan menggunakan asetup.py
untuk mendeklarasikan dependensinyaengine>=1.2.0
, dan aplikasi sampel Andareliable-car
akan menggunakanrequirements.txt
untuk mendeklarasikan dependensinyaengine>=1.2.3
, meskipun versi terbaruengine
sudah di 1.4.0. Seperti yang Anda lihat, pilihan Anda untuk angka batas bawahnya masih sedikit berbeda. Dan inilah alasannya.hybrid-engine
bergantung padaengine>=1.2.0
karena, secara hipotesis, kemampuan "pembakaran internal" yang dibutuhkan pertama kali diperkenalkanengine 1.2.0
, dan kapabilitas itu adalah kebutuhanhybrid-engine
, terlepas dari apakah mungkin ada beberapa bug (kecil) di dalam versi tersebut dan telah diperbaiki di versi 1.2.1 berikutnya , 1.2.2, dan 1.2.3.reliable-car
tergantungengine>=1.2.3
karena itu adalah versi paling awal TANPA masalah yang diketahui, sejauh ini. Tentu ada kemampuan baru di versi yang lebih baru, katakanlah, "motor listrik" diperkenalkanengine 1.3.0
, dan "reaktor nuklir" diperkenalkanengine 1.4.0
, tetapi mereka tidak diperlukan untuk proyekreliable-car
.sumber
A==1.2.3
, lalu jika paket downstream library Anda kebetulan bergantungA==1.2.4
, sekarang tidak akan ada cara untuk memenuhi keduanya. Solusi untuk meminimalkan konflik ini adalah perpustakaan Anda menentukan rentang yang Anda tahu akan berfungsi. Dengan asumsi banyak pustaka upstream sudah mengikuti semver.org ,A>=1,<2
akan berhasil.foo
tidakimport foo
memberikan? Jawaban hacky yang diterima di link yang Anda berikan berfungsi sebagai contoh sempurna mengapa pengelola paket "tidak boleh dan tidak boleh pilih-pilih". :-) Sekarang bolehkah saya mendapatkan upvote Anda?