Bagaimana cara menginstal paket dengan rentang versi minimum dan maksimum?

233

Saya bertanya-tanya apakah ada cara untuk memberitahu pip, khususnya dalam file persyaratan, untuk menginstal paket dengan versi minimum ( pip install package>=0.2) dan versi maksimum yang tidak boleh diinstal (teoretis api:) pip install package<0.3.

Saya bertanya karena saya menggunakan perpustakaan pihak ketiga yang sedang dalam pengembangan aktif. Saya ingin file persyaratan pip saya menentukan bahwa itu harus selalu menginstal rilis minor terbaru dari cabang 0.5.x, tapi saya tidak ingin pip pernah mencoba untuk menginstal versi utama yang lebih baru (seperti 0.6.x) karena API berbeda. Ini penting karena meskipun cabang 0.6.x tersedia, devs masih merilis tambalan dan perbaikan bug ke cabang 0.5.x, jadi saya tidak ingin menggunakan package==0.5.9garis statis dalam file persyaratan saya.

Apakah ada cara untuk melakukan itu?

coredumperror
sumber

Jawaban:

301

Anda dapat melakukan:

$ pip install "package>=0.2,<0.3"

Dan pipakan mencari yang paling cocok, dengan asumsi versi setidaknya 0,2, dan kurang dari 0,3.

Ini juga berlaku untuk file persyaratan pip . Lihat detail lengkap tentang penentu versi di PEP 440 .

Hugo Tavares
sumber
Tautan mati. Dokumentasi resmi di sini .
beatgammit
45
Sebagai catatan, saya pikir "package>=0.2,<=0.3"tidak masuk akal: kapan Anda akan baik-baik saja dengan baik 0,2 dan 0,3,0, tetapi tidak dengan rilis perbaikan bug 0,3? Saya pikir "package>=0.2,<0.3"ini adalah contoh yang jauh lebih baik, karena ini mencerminkan kasus umum mengatakan: "tolong beri saya rilis bugfix terbaru dari versi minor saat ini, tetapi jangan secara otomatis meningkatkan saya ke versi minor berikutnya, karena saya ingin melakukan itu secara eksplisit, memastikan bahwa tidak ada perubahan fungsional yang memengaruhi saya. "
Henrik Heimbuerger
Jika Anda menyukai jawaban ini, Anda akan menyukai jawaban Mortiz di bawah ini! Pastikan untuk memeriksanya, ~=0.2apakah (imho) solusi yang lebih baik dari ini.
Brad Root
1
@ BootRoot Benar-benar tidak jelas apa yang ~=0.2.1akan dilakukan, misalnya. Menjadi eksplisit seperti dalam >=0.2,<0.3adalah hal yang baik karena sangat jelas apa yang terjadi.
Acumenus
@Acumenus seseorang yang memahami properti format persyaratan dan cara kerja versi tidak akan menulis ~=0.2.1dalam file persyaratan. Itu kesalahan pengguna, bukan kerugian dari ~=awalan.
Brad Root
86

Anda juga bisa menggunakan:

pip install package==0.5.*

yang lebih konsisten dan mudah dibaca.

Lowrin
sumber
12
Ini adalah cara yang jauh lebih baik untuk mengelola requirements.txtIMO. Menggunakan package==1.*bukannya package>=1.2mencegah pip menginstal versi utama 2+ untuk paket, yang diinginkan karena perubahan versi utama sering tidak kompatibel.
Michael Hays
10
Catatan, Ini tidak meningkatkan paket yang ada. mis. jika Anda sudah menginstal 0.5.1, tetapi 0.5.2 adalah yang terbaru, dan Anda menjalankan instal 0.5. * itu akan mengatakan "sudah puas" dan meninggalkan Anda dengan 0.5.1. Menambahkan --upgrade menyelesaikannya.
scipilot
71

Metode yang elegan adalah dengan menggunakan ~=operator rilis yang kompatibel sesuai dengan PEP 440 . Dalam kasus Anda ini akan berjumlah:

package~=0.5.0

Sebagai contoh, jika ada versi berikut, itu akan memilih 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Untuk klarifikasi, setiap pasangan setara:

~= 0.5.0
>= 0.5.0, == 0.5.*

~= 0.5
>= 0.5, == 0.*
Moritz
sumber
Bagaimana Anda menggunakan ini untuk versi terpotong? Misalnya, jika ada 2.2dan masa depan yang direncanakan 2.2.1, akan ~=2.2.*cocok 2.2meskipun tidak ada nomor tersier?
Mike 'Pomax' Kamermans
1
@ Mike'Pomax'Kamermans Anda harus menggunakan ~=2.2.0dalam hal itu ( *operator tidak akan bekerja jika Anda menggunakan ~=). 2.2dan 2.2.0(dan 2.2.0.0, dan seterusnya) ditangani secara internal sebagai hal yang sama ketika menginstal paket.
ik1ne
Sangat tidak jelas bagaimana ini bekerja untuk penomoran versi bersarang, misalnya ~=1.2.3. Jauh lebih eksplisit dan jelas untuk menggunakan formulir multi-klausul.
Acumenus
2
@MitchMcMabers Itu hanya berfungsi jika fitur yang Anda inginkan telah hadir dalam rilis pertama dari versi utama itu, yang pada umumnya tidak benar. Jika Anda mengandalkan sesuatu yang ditambahkan di v1.2.0, misalnya, == 1.*akan menerima v1.1.0 dengan tidak tepat. Operator ~=(atau >=plus <jika Anda merasa sulit untuk membaca) lebih baik karena mendorong untuk menjadi spesifik dengan benar.
Maks.
1
@ Maxm Itu poin yang bagus. Jadi == 1.*akan gagal dan tidak melakukan apa-apa jika kita memerlukan fitur versi 1.2 tetapi pengguna sudah menginstal 1.1. Usulan Anda ~= 1.2sama dengan mengatakan >= 1.2, < 2.0(atau >= 1.2, == 1.*). Jadi ya Anda benar, ~=adalah operator terbaik karena memungkinkan Anda menargetkan versi pengembangan yang Anda gunakan dari perpustakaan, sambil memungkinkan versi yang lebih baru dalam versi utama yang sama . Terima kasih atas klarifikasi itu!
Mitch McMabers