Bagaimana cara memutakhirkan semua paket Python dengan pip?

2052

Apakah mungkin untuk meningkatkan semua paket Python sekaligus pip?

Catatan : bahwa ada permintaan fitur untuk ini pada pelacak masalah resmi.

thjjersersen
sumber
37
Hati-hati dengan perangkat lunak yang rusak — peningkatan ketergantungan mungkin merusak aplikasi Anda. Anda dapat mencantumkan versi persis semua paket yang diinstal dengan pip freeze(suka bundle installatau npm shrinkwrap). Terbaik untuk menyimpan salinan itu sebelum bermain-main.
Kolonel Panic
Hati-hati saat melakukan ini, Anda mengacaukan pipinstalasi Anda , ketika Anda meningkatkan requests. Pesan kesalahannya adalah cannot import name IncompleteRead.
Paul Rooney
11
Saya mencoba banyak jawaban dan yang lebih baru (dan karena itu jawaban dengan skor rendah) menghasilkan output yang jauh lebih baik: stackoverflow.com/questions/2720014/...
FauChristian
Permintaan dan diskusi fitur terkini: github.com/pypa/pip/issues/4551
cledoux
Pertanyaan ini sangat lama dan sangat berguna, saya hanya ingin mengingatkan siapa pun yang datang ke sini mulai sekarang bahwa sekarang ada cara terbaik resmi baru untuk melakukan semua ini: pipenv. Documents ada di sini: docs.pipenv.org/basics dan Pycon 2018 penulis tentang hal itu ada di sini: youtube.com/watch?v=GBQAKldqgZs . Selamat coding!
Malik A. Rumi

Jawaban:

2260

Belum ada bendera bawaan, tetapi Anda dapat menggunakannya

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

Catatan: ada variasi potensial tak terbatas untuk ini. Saya mencoba untuk membuat jawaban ini singkat dan sederhana, tetapi tolong sarankan variasi dalam komentar!

Di versi yang lebih lama pip, Anda bisa menggunakan ini:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

The grepadalah untuk melewati diedit ( "-e") paket definisi, seperti yang disarankan oleh @jawache. (Ya, Anda bisa menggantikan grep+ cutdengan sedatau awkatau perlatau ...).

The -n1bendera untuk xargsmencegah menghentikan segala sesuatu jika memperbarui satu paket gagal (terima kasih @andsens ).

rbp
sumber
59
Benar :( Masalahnya sekarang tinggal di github.com/pypa/pip/issues/59 . Tetapi setiap saran tampaknya dijawab dengan "Ya, tapi aku terlalu yakin jika X adalah cara yang tepat untuk melakukan Y" ... Sekarang lebih baik daripada tidak pernah? Kepraktisan mengalahkan kemurnian? :(
rbp
20
Itu juga mencetak paket-paket yang diinstal dengan manajer paket normal (seperti apt-get atau Synaptic). Jika saya menjalankan ini pip install -U, itu akan memperbarui semua paket. Saya khawatir ini dapat menyebabkan beberapa konflik dengan apt-get.
Jabba
8
Bagaimana dengan mengubah grep ke: egrep -v '^ (\ - e | #)' (saya mendapatkan baris ini ketika menjalankannya di ubuntu 12.10: "## FIXME: tidak dapat menemukan URL svn di dependency_links untuk paket ini:".
LasseValentini
32
Saya akan melemparkan teesebelum melakukan upgrade yang sebenarnya sehingga Anda bisa mendapatkan daftar verison asli. Misalnya pip freeze --local | tee before_upgrade.txt | ...Dengan cara itu akan lebih mudah untuk mengembalikan jika ada masalah.
Emil H
10
Saya menambahkan -Huntuk sudomenghindari pesan kesalahan yang mengganggu: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Mario S
683

Anda dapat menggunakan kode Python berikut. Tidak seperti pip freezeini, ini tidak akan mencetak peringatan dan kesalahan FIXME. Untuk pip <10.0.1

import pip
from subprocess import call

packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)

Untuk pip> = 10.0.1

import pkg_resources
from subprocess import call

packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade " + ' '.join(packages), shell=True)
Manishankar Singh
sumber
21
Ini bekerja sangat baik ... Itu selalu sangat memuaskan ketika tugas membutuhkan waktu yang SANGAT lama ... dan memberi Anda banyak hal baru! PS: Jalankan sebagai root jika Anda menggunakan OS X!
Alex Grey
52
Apakah tidak ada cara untuk menginstal menggunakan pip tanpa memanggil subproses? Sesuatu seperti import pip pip.install('packagename')?
endolith
6
Saya membungkus ini dalam fabfile.py . Terima kasih!
Josh K
5
@BenMezger: Anda seharusnya tidak menggunakan paket sistem di virtualenv Anda. Anda juga seharusnya tidak menjalankan lebih dari beberapa program tepercaya dan terkenal sebagai root. Jalankan virtualenvs Anda dengan --no-situs-paket (default di versi terbaru).
jeffcook2150
3
Jempol untuk yang ini, jawaban yang dipilih (di atas) gagal jika sebuah paket tidak dapat ditemukan lagi. Script ini terus berlanjut ke paket berikutnya, luar biasa.
Josh
644

Untuk meningkatkan semua paket lokal; Anda bisa menggunakannyapip-review :

$ pip install pip-review
$ pip-review --local --interactive

pip-reviewadalah garpu pip-tools. Lihat pip-toolsmasalah yang disebutkan oleh @knedlsepp . pip-reviewpaket bekerja tetapi pip-toolspaket tidak lagi berfungsi.

pip-reviewbekerja pada Windows sejak versi 0.5 .

jfs
sumber
2
@ Hauzer: Itu tidak mendukung Python 3. Meskipun mungkin bug
jfs
7
@mkoistinen Ini adalah alat yang bagus tetapi sampai digabung dalam PIP itu berarti menginstal sesuatu yang tambahan yang tidak semua orang inginkan.
Wernight
2
@Aniel: pip-tools tidak lagi berfungsi, pip-review (garpu pip-tools) bekerja.
jfs
7
pip-review berfungsi dengan baik (setidaknya untuk Python versi 3.5.0)
FredrikHedman
16
Untuk memperbarui semua tanpa mode interaktif:pip-review --local --auto
Dlamini
333

Bekerja di Windows. Seharusnya juga baik untuk orang lain. ($ adalah direktori apa pun yang Anda masuki, pada prompt perintah. mis. C: / Pengguna / Nama Pengguna>)

melakukan

$ pip freeze > requirements.txt

buka file teks, ganti ==dengan >=, dan jalankan

$ pip install -r requirements.txt --upgrade

Jika Anda memiliki masalah dengan paket tertentu yang menghentikan upgrade (kadang-kadang numpy), buka saja direktori ($), beri komentar pada namanya (tambahkan # sebelum) dan jalankan upgrade lagi. Anda nanti dapat menghapus komentar bagian itu kembali. Ini juga bagus untuk menyalin lingkungan global python.


Cara lain:

Saya juga suka metode pip-review:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

Anda dapat memilih 'a' untuk meningkatkan semua paket; jika satu upgrade gagal, jalankan lagi dan berlanjut di yang berikutnya.

azazelspeaks
sumber
29
Anda harus menghapus requirements.txt's =={version}. Misalnya: python-dateutil==2.4.2untuk python-dateutiluntuk semua baris.
youngminz
4
Saya menemukan bahwa ini tidak benar-benar meningkatkan paket pada macOS.
jkooker
10
@youngminz Saya akan merekomendasikan kembali 'Ganti semua "=="> "> =" di editor / ide Anda sebelum menjalankan' pip install ... 'untuk memperbaikinya
Amaury Liet
7
untuk linux: $ pip freeze | cut -d '=' -f1> requirements.txtuntuk menghapus versi
Cavaz
1
Jika shell yang Anda gunakan adalah bash, Anda dapat mempersingkatnya menjadi satu perintah melalui pip3 install -r <(pip3 freeze) --upgrade Efektif, <(pip3 freeze)adalah pipa anonim, tetapi itu akan bertindak sebagai objek file
Sergiy Kolodyazhnyy
128

Versi Windows setelah konsultasi baik dokumentasi untuk FORoleh Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
Piotr Dobrogost
sumber
19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Lebih cepat karena hanya akan mencoba dan memperbarui paket "usang"
Refael Ackermann
3
@RefaelAckermann Saya menduga ini akan lebih lambat daripada yang asli :) Untuk mengetahui paket mana yang sudah usang, pip harus memeriksa dulu versi terbaru dari setiap paket. Itu tidak persis sama dengan langkah pertama saat memperbarui dan tidak melanjutkan jika tidak ada versi yang lebih baru. Namun di pip versi Anda akan memeriksa versi dua kali, pertama kali untuk membuat daftar paket yang sudah ketinggalan zaman dan yang kedua saat memperbarui paket pada daftar ini.
Piotr Dobrogost
2
@RefaelAckermann Spinning up pip adalah urutan besarnya lebih cepat daripada memeriksa versi paket melalui jaringan sehingga jumlah pemeriksaan yang harus dioptimalkan bukan jumlah spin up. Milik saya membuat cek n, Anda membuat cek n + m.
Piotr Dobrogost
2
+1 - Ini 6.20.2019, saya menggunakan Python 3.7.3 di WIndows 10, dan ini adalah cara terbaik bagi saya untuk memperbarui semua paket lokal saya.
MacItaly
1
Perlu melewatkan dua baris pertama dari output: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Jika ini dijalankan dari file batch, pastikan untuk menggunakan %%ibukan %i. Juga perhatikan bahwa lebih bersih untuk memperbarui pipsebelum menjalankan perintah ini menggunakan python -m pip install --upgrade pip.
Andy
127

Gunakan pipupgrade !

$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes

pipupgrade membantu Anda meningkatkan sistem Anda, lokal atau paket dari requirements.txtfile! Itu juga secara selektif meningkatkan paket yang tidak merusak perubahan. pipupgrade juga memastikan untuk meningkatkan paket yang ada dalam beberapa lingkungan Python. Kompatibel dengan Python2.7 +, Python3.4 + dan pip9 +, pip10 +, pip18 +, pip19 +.

masukkan deskripsi gambar di sini

CATATAN: Saya penulis alat ini.

Achilles Gasper Rasquinha
sumber
1
Metode ini memiliki keluaran yang jauh lebih bersih daripada jawaban @ rbp
Gaia
7
Ide bagus, tapi macet Checking...selamanya ketika saya mencobanya.
CGFoX
1
Baru saja menginstalnya dan juga macet saat memeriksa[0;93mChecking...[0m
Chris
1
@nathandrake hati-hati untuk membuka masalah di halaman masalah?
Achilles Gasper Rasquinha
2
Mendapat kesalahan pada Windows 10 dan Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
Qin Heyang
74

Anda hanya dapat mencetak paket yang sudah usang

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
janrito
sumber
14
Di dalam virtualenv, saya melakukannya seperti ini:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Jeremy Blanchard
Saat ini Anda juga dapat melakukannya dengan python -m pip list outdated(meskipun tidak dalam format persyaratan).
Jacktose
74

Menurut saya, opsi ini lebih mudah dan mudah dibaca:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

Penjelasannya adalah bahwa pip list --outdatedmenampilkan daftar semua paket usang dalam format ini:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

Dalam perintah awk, NR>2melompati dua record pertama (baris) dan {print $1}memilih kata pertama dari setiap baris (seperti yang disarankan oleh SergioAraujo, saya dihapus tail -n +3karena awkmemang bisa menangani skipping record).

Marc
sumber
Jika satu upgrade gagal, tidak ada upgrade yang terjadi.
Boris
2
Anda dapat menghindari ekor awk 'NR>2 {print $1}'membersihkan output untuk Anda
SergioAraujo
@SergioAraujo, ini membuat solusinya terlihat lebih bersih, terima kasih atas tipnya!
Marc
67

One-liner berikut mungkin membuktikan bantuan:

(pip> 20.0)

pip list --format freeze --outdated | sed 's/=.*//g' | xargs -n1 pip install -U

Versi Lama:

pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 terus berjalan jika terjadi kesalahan.

Jika Anda membutuhkan lebih banyak kontrol "berbutir halus" atas apa yang dihilangkan dan apa yang menimbulkan kesalahan, Anda tidak boleh menambahkan -n1flag dan secara eksplisit mendefinisikan kesalahan yang harus diabaikan, dengan "memipis" baris berikut untuk setiap kesalahan yang terpisah:

| sed 's/^<First characters of the error>.*//'

Berikut ini contoh kerjanya:

pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U
raratiru
sumber
Harus menambahkan filter untuk baris yang dimulai dengan 'Bisa' dan 'Beberapa' karena tampaknya pip mengirimkan peringatan ke stdout :(
Chip Camden
OK, ini adil: Anda dapat menambahkan sebanyak yang | sed 's/^<First characters of the error>.*//'diperlukan. Terima kasih!
raratiru
14
Atau:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Jens
51

Solusi Lebih Kuat

Untuk pip3 gunakan ini:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

Untuk pip, hapus saja 3s seperti itu:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

Keanehan OSX

OSX, mulai Juli 2017, dikirimkan dengan versi sed yang sangat lama (belasan tahun). Untuk mendapatkan ekspresi reguler yang diperluas, gunakan -E bukannya -r dalam solusi di atas.

Memecahkan Masalah dengan Solusi Populer

Solusi ini dirancang dan diuji dengan baik 1 , sedangkan ada masalah bahkan dengan solusi yang paling populer.

  • Masalah portabilitas karena perubahan fitur-fitur baris perintah pip
  • Menabrak xargs karena pip umum atau proses anak pip3 gagal
  • Penebangan yang ramai dari output xargs mentah
  • Mengandalkan jembatan Python-ke-OS sementara berpotensi meningkatkannya 3

Perintah di atas menggunakan sintaksis pip yang paling sederhana dan paling portabel dalam kombinasi dengan sed dan sh untuk mengatasi masalah ini sepenuhnya. Rincian operasi sed dapat diteliti dengan versi komentar 2 .


Detail

[1] Diuji dan secara teratur digunakan dalam cluster Linux 4.8.16-200.fc24.x86_64 dan diuji pada lima rasa Linux / Unix lainnya. Ini juga berjalan pada Cygwin64 yang diinstal pada Windows 10. Diperlukan pengujian pada iOS.

[2] Untuk melihat anatomi perintah dengan lebih jelas, ini sama dengan perintah pip3 di atas dengan komentar:

# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"

# separate the output of package upgrades with a blank line
sed="$sed/echo"

# indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# output the commands
sed="$sed/p"

# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh

[3] Memutakhirkan komponen Python atau PIP yang juga digunakan dalam peningkatan komponen Python atau PIP dapat menjadi penyebab potensial kebuntuan atau paket kerusakan basis data.

Douglas Daseeco
sumber
1
cara lain untuk mengatasi BSD jurassic sedOS X adalah dengan menggunakan gsed(GNU sed) sebagai gantinya. Untuk mendapatkannya,brew install gnu-sed
Walter Tross
@WalterTross ... Jurassic ... penggunaan kata sifat yang bagus. Jadi kami sekarang memiliki dua cara untuk mengelompokkan pembaruan paket pip dengan jejak audit yang bagus di terminal. (1) Gunakan opsi -E seperti pada jawaban dan (2) instal gsed untuk meninggalkan periode Jurassic.
Douglas Daseeco
41

Ini sepertinya lebih ringkas.

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

Penjelasan:

pip list --outdated mendapat garis seperti ini

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

Dalam cut -d ' ' -f1, -d ' 'set "spasi" sebagai pembatas, -f1berarti untuk mendapatkan kolom pertama.

Jadi baris di atas menjadi:

urllib3
wheel

kemudian meneruskannya ke xargsuntuk menjalankan perintah pip install -U,, dengan setiap baris sebagai argumen tambahan

-n1membatasi jumlah argumen yang diteruskan ke setiap perintah pip install -Umenjadi 1

Shihao Xu
sumber
Saya menerima peringatan iniDEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Reman
2
@Reman: itu karena Anda menggunakan Pip v9.0.1. Ini hanya pesan penghinaan yang berarti bahwa beberapa fungsi tidak akan bertahan dalam rilis Pip di masa depan. Tidak ada yang perlu dikhawatirkan;)
AlessioX
Namun, ini harus ditandai sebagai solusi akhir. Memang jawaban yang diterima akan berlaku di seluruh paket pip Anda, yang merupakan buang-buang waktu jika Anda harus memperbarui hanya 1 atau 2 paket. Solusi ini, sebagai gantinya, akan berjalan di seluruh paket yang sudah ketinggalan zaman
AlessioX
34

Saya memiliki masalah yang sama dengan peningkatan. Masalahnya, saya tidak pernah memperbarui semua paket. Saya hanya memutakhirkan apa yang saya butuhkan, karena proyek mungkin rusak.

Karena tidak ada cara mudah untuk memutakhirkan paket dengan paket, dan memperbarui file requirement.txt, saya menulis pembaruan pip ini yang juga memperbarui versi dalam 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 dalam virtualenv saat ini).

cd ke direktori proyek Anda, lalu jalankan:

pip-upgrade

Penggunaan tingkat lanjut

Jika persyaratan ditempatkan di lokasi yang tidak 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
8
Inilah yang harus dilakukan pip secara default.
Nostalg.io
mengepalai dengan alat Anda beberapa karakter lolos tampaknya tidak berfungsi dengan baik pada mesin windows saya tapi selain itu tidak apa
Luke
belum benar-benar mengujinya di windows, tetapi saya akan menginstal mesin virtual. Terima kasih
Simion Agavriloaei
Jika virtualenvtidak diaktifkanpip-upgrade --skip-virtualenv-check
Morse
2
Ini berfungsi juga dengan folder persyaratan yang memiliki persyaratan umum, dev, dan prod. Luar biasa!
cwhisperer
28

Dari https://github.com/cakebread/yolk :

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

namun Anda harus mendapatkan kuning telur terlebih dahulu:

$ sudo pip install -U yolk
tkr
sumber
1
Terakhir dilakukan 7 tahun yang lalu
Boris
pada tahun 2013 M
dotbit
27

Jawaban @ Ramana versi satu-baris .

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`

Salman von Abbas
sumber
4
subprocess.call ("sudo pip install ... jika Anda membutuhkan izin
Maximiliano Rios
4
@MaximilianoRios Tolong jangan sudo pip install, gunakan env virtual , sebagai gantinya.
Bengt
22

saat menggunakan virtualenv dan jika Anda hanya ingin memutakhirkan paket yang ditambahkan ke virtualenv Anda, Anda mungkin ingin melakukan:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
brunobord
sumber
19

Solusi paling sederhana dan tercepat yang saya temukan dalam diskusi masalah pip adalah:

pip install pipdate
pipdate

Sumber: https://github.com/pypa/pip/issues/3819

RedEyed
sumber
2
Sementara solusi lain terhenti ketika menemui anomali sekecil apa pun, solusi ini memperingatkan dan kemudian melewatkan masalah untuk melanjutkan dengan paket lainnya. Bagus!
Serge Stroobandt
18

Solusi Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Apeirogon Prime
sumber
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
Isi
2
Mungkin pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}akan lebih tepat.
brainplot
16

gunakan paket pembaruan awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

pembaruan windows powershell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

JohnDHH
sumber
pembekuan pip | awk -F '[=]' '{print $ 1}' | xargs pip install -U
JohnDHH
Dan untuk python 3 ... instal pip3 -U $ (pembekuan pip3 | awk -F '[=]' '{print $ 1}')
Jimmy MG Lim
12

Anda dapat mencoba ini:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
何宗翰
sumber
ini adalah cara terbersih, tertinggi yang dapat dibaca untuk memperbarui paket pip dalam jumlah singkat. Bagus.
Mark Shust di M.academy
12

Kuning telur yang agak menakjubkan membuat ini mudah.

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

Untuk info lebih lanjut tentang kuning telur: https://pypi.python.org/pypi/yolk/0.4.3

Ini dapat melakukan banyak hal yang mungkin berguna bagi Anda.

pengguna1175849
sumber
3
Jawaban Anda telah diubah dari yolkmenjadi yolk3k, jawaban asli Anda pasti memiliki masalah dengan python3.
AXO
10

Jawaban @ Ramana bekerja paling baik untuk saya, dari yang ada di sini, tetapi saya harus menambahkan beberapa tangkapan:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

The site-packagescek tidak termasuk paket pengembangan saya, karena mereka tidak terletak dalam sistem direktori situs-paket. Try-kecuali hanya melompati paket yang telah dihapus dari PyPI.

@endolith: Saya juga berharap mudah pip.install(dist.key, upgrade=True), tetapi sepertinya pip tidak dimaksudkan untuk digunakan oleh apa pun kecuali baris perintah (dokumen tidak menyebutkan API internal, dan pengembang pip tidak menggunakan docstrings).

chbrown
sumber
Di Ubuntu (dan turunan Debian lainnya), piptampaknya memasukkan paket /usr/local/lib/python2.7/dist-packagesatau sejenisnya. Anda bisa menggunakan '/ usr / local / lib /' daripada 'paket situs' dalam ifpernyataan dalam kasus ini.
drevicko
10

Melakukan pip_upgrade_outdatedpekerjaan. Menurut dokumennya :

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

Langkah 1:

pip install pip-upgrade-outdated

Langkah 2:

pip_upgrade_outdated
adrin
sumber
1
Langkah 1: pip instal pip-upgrade-outdated Langkah 2: pip-upgrade-outdated ... selesai
shao.lo
9

Dikirim melalui permintaan-tarik ke rakyat pipa ; Sementara itu gunakan solusi pustaka pip ini yang saya tulis:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted
Samuel Marks
sumber
Versi dengan penanganan kesalahan (sesuai komentar): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
Samuel Marks
9

Ini sepertinya bekerja untuk saya ...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

Saya menggunakan printfspasi setelahnya untuk memisahkan nama paket dengan benar.

SaxDaddy
sumber
7

Ini adalah solusi PowerShell untuk Python 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

Dan untuk Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

Ini meningkatkan paket satu per satu. Jadi a

pip3 check
pip2 check

setelah itu harus memastikan tidak ada dependensi yang rusak.

Nils Ballmann
sumber
7

Bagaimana tentang:

pip install -r <(pip freeze) --upgrade
pengguna8598996
sumber
7

Terpendek dan termudah di Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Ankireddy
sumber
@Enkouyami di windows 7 perintah ini tidak berfungsi tanpa -r. -r harus menghalangi jalur ke file persyaratan.
Chockomonkey
6

Skrip saya:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
Icyblade
sumber
6

Bukankah ini lebih efektif?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o daftar paket usang;
  2. grep -v -i warning pertandingan terbalik aktif warning untuk menghindari kesalahan saat memperbarui
  3. cut -f1 -d1' ' mengembalikan kata pertama - nama paket yang sudah ketinggalan zaman;
  4. tr "\n|\r" " "mengubah hasil multiline cutmenjadi satu baris, daftar yang dipisahkan oleh ruang;
  5. awk '{if(NR>=3)print}' melompati garis tajuk
  6. cut -d' ' -f1 mengambil kolom pertama
  7. xargs -n1 pip install -U mengambil 1 argumen dari pipa sebelah kiri, dan meneruskannya ke perintah untuk memutakhirkan daftar paket.
Alex V
sumber
Ini hasil saya: kerberos iwlib PyYAML Could pygpgme Could Could Could ...Catat semua "Bisa". Mereka berasal dari output pip list -o"Tidak dapat menemukan unduhan yang memenuhi persyaratan <paket"
DrStrangepork
Bisakah Anda menempelkan output pip list -o?
Alex V
Komentar tidak memformat ini dengan baik, tetapi ini cuplikan (ujung garis ditandai dengan ';'):# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
DrStrangepork
bukannya menyaring semua baris yang tidak boleh digunakan, saya akan menyarankan untuk menyaring garis mana update ada: pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . Kalau tidak, Anda bisa dengan mudah melewatkan satu baris yang tidak Anda inginkan dan mendapatkan hasil yang disebutkan DrStrangeprk.
antibus
Saya akan sangat menyarankan menggunakan xargssebagai gantinya. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UThe -rbendera memastikan bahwa pip install -Utidak akan berjalan jika tidak ada paket usang. The -pbendera meminta pengguna untuk mengkonfirmasi sebelum mengeksekusi perintah apapun. Anda dapat menambahkan -n1bendera untuk meminta Anda sebelum menginstal setiap paket secara terpisah.
Enam
6

satu baris di PowerShell 5.1 dengan hak adm, python 3.6.5 dan pip ver 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

itu berfungsi dengan lancar jika tidak ada paket rusak atau roda khusus dalam daftar ...

Sébastien Wieckowski
sumber