Tingkatkan paket python dari requirement.txt menggunakan perintah pip

113

Bagaimana cara mengupgrade semua paket python saya dari file requirement.txt menggunakan perintah pip?

dicoba dengan perintah di bawah ini

$ pip install --upgrade -r requirements.txt

Karena, paket python diakhiri dengan nomor versi ( Django==1.5.1) yang sepertinya tidak diupgrade. Apakah ada pendekatan yang lebih baik daripada mengedit file requirement.txt secara manual?

EDIT

Seperti yang disebutkan Andy dalam jawabannya, paket disematkan ke versi tertentu, oleh karena itu tidak mungkin mengupgrade paket melalui perintah pip.

Tapi, kita bisa mencapai ini dengan pip-toolsmenggunakan perintah berikut.

$ pip-review --auto

ini secara otomatis akan mengupgrade semua paket dari requirement.txt (pastikan untuk menginstal pip-toolsmenggunakan perintah pip install).

abhiomkar
sumber
7
Pip-tools bekerja dengan baik - sintaks yang diperbarui pip-compile -U requirements.txt.
erikreed

Jawaban:

40

Tidak. File persyaratan Anda telah disematkan ke versi tertentu. Jika persyaratan Anda disetel ke versi itu, Anda tidak boleh mencoba meningkatkan versi di luar versi tersebut. Jika Anda membutuhkan meningkatkan, Anda perlu beralih ke versi yang tidak disematkan di file persyaratan Anda.

Contoh:

lxml>=2.2.0

Ini akan meningkatkan lxml ke versi yang lebih baru dari 2.2.0

lxml>=2.2.0,<2.3.0

Ini akan meningkatkan lxml ke versi terbaru antara 2.2.0 dan 2.3.0.

Andy
sumber
2
Saya merasa terbantu untuk melakukan hal berikut. 1. Menghapus venv 2. Membuat yang baru dengan nama yang sama (cara membersihkan semua paket pip) 3. Ganti semua == ke> = di Requirement.txt 4. pip install -r requirement.txt 4.
zhukovgreen
sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt akan mengganti semua ==dengan>=
philshem
80

Anda dapat mencoba:

pip install --upgrade --force-reinstall -r requirements.txt

Anda juga dapat mengabaikan paket yang diinstal dan menginstal yang baru:

pip install --ignore-installed -r requirements.txt
Freelancer
sumber
2
dengan opsi itu tampaknya menginstal ulang versi yang sama. Seperti yang disebutkan Andy dalam jawaban di atas, paket disematkan ke versi tertentu.
abhiomkar
@abhiomkar Anda benar Saya pikir Anda ingin menginstal ulang versi yang sama (mungkin untuk menambahkan perbaikan backport)
Freelancer
1
Perintah kedua adalah apa yang saya cari. Perhatikan bahwa -Iand --ignore-installedadalah flag yang sama dan tentu saja tidak valid untuk memiliki a ,di sana. Dengan cara ini tidak akan terjadi penurunan versi selama penginstalan dan setelah penginstalan persyaratan selesai, seseorang dapat mengupgrade paket yang diinstal menggunakan pip-review --auto.
AXO
79

Saya sudah menjawab pertanyaan ini di sini . Inilah solusi saya:

Karena tidak ada cara mudah untuk mengupgrade paket demi paket, dan mengupdate file requirement.txt, saya menulis pip-upgrader ini yang juga mengupdate versi di requirements.txtfile Anda untuk paket yang dipilih (atau semua paket).

Instalasi

pip install pip-upgrader

Pemakaian

Aktifkan virtualenv Anda (penting, karena itu juga akan menginstal versi baru dari paket yang ditingkatkan di virtualenv saat ini).

cd ke dalam direktori proyek Anda, lalu jalankan:

pip-upgrade

Penggunaan lanjutan

Jika persyaratan ditempatkan di lokasi non-standar, kirimkan sebagai argumen:

pip-upgrade path/to/requirements.txt

Jika Anda sudah tahu paket apa yang ingin Anda tingkatkan, cukup kirimkan sebagai argumen:

pip-upgrade -p django -p celery -p dateutil

Jika Anda perlu meningkatkan ke versi pra-rilis / pasca-rilis, tambahkan --prereleaseargumen ke perintah Anda.

Pengungkapan penuh: Saya menulis paket ini.

Simion Agavriloaei
sumber
5
Bagus! Mengejutkan bahwa fungsi seperti itu tidak hadir secara langsung di pip
Jacopofar
5
Anggun! Sangat senang saya menggulir ke bawah ini: P
PulseJet
3
Saya baru saja menggunakan ini, dan ini adalah yang terbaik sejak f-string.
Pierre.Sassoulas
1
Alat yang hebat. Terima kasih.
mszaro
Alat yang sangat berguna! Saya juga menemukan paket lain yang disebut pur yang meningkatkan versi yang disematkan juga
Gal Avineri
4

Saya sarankan untuk membekukan semua dependensi Anda untuk memiliki build yang dapat diprediksi .

Saat melakukan itu, Anda dapat memperbarui semua dependensi sekaligus seperti ini:

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

Setelah melakukan hal di atas, menguji proyek Anda dengan set baru paket dan akhirnya berkomitmen dalam requirements.txtberkas ke repositori.

Hermes
sumber
3

Saya baru saja melakukan hal yang sama ... menggunakan satu baris kecil ini untuk melakukan pekerjaan:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

yang:

  • packages=$(cat requirements.txt | sed 's/==.*//g') membuat daftar nama paket saat ini di requirement.txt (menghapus versinya).
  • echo $packages | xargs pip3 install -U kemudian meneruskan semua paket sebagai argumen ke pip3 untuk ditingkatkan.
  • freeze=$(pip3 freeze); Mendapatkan semua versi paket saat ini dalam format yang diperlukan untuk Requirement.txt
  • for p in $(echo $packages) kemudian melakukan iterasi melalui nama paket
    • echo $freeze | grep -E "^${p}==" >> requirements.new mendapatkan baris versi paket dari keluaran pip freeze yang cocok dengan paket dan menulis ke requirement.txt baru

Ini memiliki keuntungan tambahan dalam menjaga urutan persyaratan asli.txt. :)

Semoga ini membantu!

MatthewJohn
sumber
2

Karena saya tidak dapat melakukannya menggunakan bash, saya menulis modul python untuk membuat file persyaratan baru tanpa versi dan menggunakannya:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

Kemudian instal libs dari file baru pip install -U -r requirements-prod-no-version.pip

Terakhir, bekukan versinya ke file aslinya pip freeze > requirements-prod.pip

Montaro
sumber
2

Solusi lain adalah dengan menggunakan paket persyaratan peningkatan

pip install upgrade-requirements

Dan kemudian jalankan:

upgrade-requirements

Itu akan meningkatkan semua paket yang tidak ada di versi terbaru mereka, dan juga membuat persyaratan yang diperbarui di bagian akhir.

dmdip
sumber
0
  • 1) Untuk mengupgrade file yang diinstal pip dari reqs.txt tambahkan > = sebagai pengganti == ini akan memberi tahu pip untuk menginstal lib lebih besar dari atau sama dengan versi yang Anda minta, di sini dengan menginstal versi terbaru dari library yang diminta

    1.a) ** Jawaban saya untuk utas ** Dengan menambahkan py -m pip install -r reqs.txt ke restart harian ... atau sesuatu yang bersifat alami, Anda dapat memperbarui libs yang diinstal. Disimpulkan oleh Andy Perfectly

    -Alasan saya untuk memasuki utas ini adalah untuk mencari informasi tentang cara memperbarui virtual env base pip (biasanya 10.0.03 untuk saya ??)

dengan harapan dapat memenuhi masalah yang saya dapat memperoleh salah satu dari dua solusi

A. pembuatan venv || B. Instalasi libs yang Diperlukan

Berkat Andy, saya telah memenuhi kebutuhan B

Dengan menambahkan pip > = versi yang diminta di reqs.txt

setelah instance dari Virtual-Environment baru || re-instantiation dari Venv sebelumnya

  1. py -m venv devenv

untuk menyiapkan env dev baru

  1. devenv\scripts\activate.bat

untuk mengaktifkan dev env

  1. python -m pip install -r requirenments.txt

untuk menginstal base libs

keluaran yeilds

Mengumpulkan pip > = 20.0.2 (dari -r Requirement.txt (baris 1)) Menggunakan cache> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3- none-any.whl

Instalasi yang sudah ditemukan: pip 10.0.1

Menghapus instalasi pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Maaf untuk Brain Dump, Semoga ini bisa membantu seseorang :)

🤳 Austin 👨‍🎤🚀🥊

Austin Atherton
sumber
0

Jawaban kedua adalah yang paling berguna tetapi yang ingin saya lakukan adalah mengunci beberapa paket sementara yang lain memiliki versi terbaru (misalnya youtube-dl).

Contohnya requirements.txtakan terlihat seperti ini (~ berarti kompatibel):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Kemudian di terminal, gunakan perintah pip install --upgrade -r requirements.txt

Ini memastikan bahwa Pillow akan tetap di 6.2.2, permintaan akan ditingkatkan ke versi terbaru 2.22.x (jika tersedia), dan versi terbaru youtube-dl akan diinstal jika belum.

Eli
sumber
0

Saya kira solusi paling sederhana adalah membuat persyaratan.txt dengan:

pip freeze | sed 's/==/>=/' > requirements.txt
Gumwon Hong
sumber
-1

Jika Anda menginstal apa pun dalam proyek django Anda dan setelah instalasi Anda ingin memperbarui file persyaratan Anda, perintah ini dapat memperbarui Anda file Requirement.txt pip freeze> Requirement.txt

jika file persyaratan Anda tidak ada dalam proyek Anda, Anda dapat menggunakan perintah ini untuk membuat file requirement.txt baru pip freeze> requirement.txt

Gaurav Mandhotra
sumber
ini adalah ide yang buruk karena ini juga akan menambah persyaratan dari semua kebutuhan Anda, menghasilkan file persyaratan yang besar dan tidak perlu. Jika Anda kemudian memutuskan untuk memperbarui satu dependensi, Anda kemungkinan akan mengalami konflik versi, kecuali Anda tahu persyaratan lain mana yang ditambahkan ke file persyaratan Anda karena paket itu.
kerusuhan
-10

Saya mengedit persyaratan.txt seperti di bawah ini dan menjalankan $ sh ./requirements.txt

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;
Santhosh Yedidi
sumber
3
Ini adalah contoh ideal dari anti-pola. Apa yang salah di sini: 1) Requirement.txt adalah file .txt, tetapi Anda membuatnya dapat dieksekusi 2). Ada perintah pip install -r requirement.txt sederhana. Jadi, Anda dapat menggunakan file requirement.txt hanya untuk mencantumkan dependensi proyek Anda. 3) Anda tidak menggunakan versi paket. 4) Bukan pola umum, pengembang lain tidak tahu apa-apa tentang cara menggunakannya. 5) Sulit digunakan dengan pipeline CI / CD. Tolong jangan gunakan contoh ini
Fannigurt