Daha Sağlam Çözüm
Pip3 için bunu kullanın:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Pip için, 3'leri şu şekilde çıkarın:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OSX Tuhaflığı
OSX, Temmuz 2017 itibariyle, sed'in çok eski bir sürümüyle (bir düzine yaşında) birlikte gelir. Genişletilmiş düzenli ifadeler almak için yukarıdaki çözümde -r yerine -E kullanın.
Popüler Çözümlerle Sorun Çözme
Bu çözüm iyi tasarlanmış ve test edilmiştir 1 , oysa en popüler çözümlerde bile problemler vardır.
- Pip komut satırı özelliklerinin değiştirilmesi nedeniyle taşınabilirlik sorunları
- Ortak pip veya pip3 alt işlem hataları nedeniyle xargs'ın çökmesi
- Ham xargs çıktısından kalabalık günlük kaydı
- Potansiyel olarak yükseltme yaparken Python-OS köprüsüne güvenme 3
Yukarıdaki komut, bu sorunların tamamen üstesinden gelmek için sed ve sh ile birlikte en basit ve en taşınabilir pip sözdizimini kullanır. Sed operasyonunun detayları yorumlanan versiyon 2 ile incelenebilir .
ayrıntılar
[1] Bir Linux 4.8.16-200.fc24.x86_64 kümesinde test edildi ve düzenli olarak kullanıldı ve diğer beş Linux / Unix çeşidinde test edildi. Ayrıca Windows 10'da yüklü Cygwin64 üzerinde çalışır. İOS'ta test yapılması gerekir.
[2] Komutun anatomisini daha net görmek için, yukarıdaki pip3 komutunun yorumlarla tam eşdeğeridir:
# 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] Python veya PIP bileşeninin yükseltilmesinde de kullanılan bir Python veya PIP bileşeninin yükseltilmesi, kilitlenme veya paket veritabanı bozulmasının olası bir nedeni olabilir.
pip freeze
(bundle install
veya gibinpm shrinkwrap
) ile listeleyebilirsiniz . Tamir etmeden önce bunun bir kopyasını kaydetmek en iyisidir.