Bardziej niezawodne rozwiązanie
W przypadku pip3 użyj tego:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
W przypadku pip, po prostu usuń 3 jako takie:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OSX Oddity
OSX, od lipca 2017 r., Jest wyposażony w bardzo starą wersję sed (kilkanaście lat). Aby uzyskać rozszerzone wyrażenia regularne, użyj -E zamiast -r w powyższym rozwiązaniu.
Rozwiązywanie problemów z popularnymi rozwiązaniami
To rozwiązanie jest dobrze zaprojektowane i przetestowane 1 , podczas gdy występują problemy nawet z najbardziej popularnymi rozwiązaniami.
- Problemy z przenośnością spowodowane zmianą funkcji linii poleceń pip
- Awaria xargs z powodu typowych błędów procesu potomnego pip lub pip3
- Zatłoczone logowanie z surowego wyjścia xargs
- Poleganie na mostku Python-OS podczas potencjalnej aktualizacji 3
Powyższe polecenie używa najprostszej i najbardziej przenośnej składni pip w połączeniu z sed i sh, aby całkowicie rozwiązać te problemy. Szczegóły operacji sed można sprawdzić za pomocą skomentowanej wersji 2 .
Detale
[1] Testowane i regularnie używane w klastrze Linux 4.8.16-200.fc24.x86_64 i testowane na pięciu innych odmianach Linux / Unix. Działa również na Cygwin64 zainstalowanym w systemie Windows 10. Konieczne jest przetestowanie na iOS.
[2] Aby dokładniej zobaczyć anatomię polecenia, jest to dokładny odpowiednik powyższego polecenia pip3 z komentarzami:
# 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] Uaktualnienie komponentu Python lub PIP, który jest również używany do uaktualnienia komponentu Python lub PIP, może być potencjalną przyczyną impasu lub uszkodzenia bazy danych pakietu.
pip freeze
(jakbundle install
lubnpm shrinkwrap
). Najlepiej zapisać kopię tego przed majstrowaniem.