Solução mais robusta
Para o pip3, use o seguinte:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Para pip, basta remover os 3s como tal:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OSX Oddity
O OSX, em julho de 2017, é enviado com uma versão muito antiga do sed (uma dúzia de anos). Para obter expressões regulares estendidas, use -E em vez de -r na solução acima.
Solução de problemas com soluções populares
Essa solução foi bem projetada e testada 1 , enquanto há problemas até nas soluções mais populares.
- Problemas de portabilidade devido à alteração dos recursos da linha de comando pip
- Falha no xargs porque falhas comuns no processo filho pip ou pip3
- Registro lotado da saída bruta de xargs
- Confiando em uma ponte de Python para OS e atualizando-a potencialmente 3
O comando acima usa a sintaxe de pip mais simples e mais portátil em combinação com sed e sh para superar esses problemas completamente. Detalhes da operação sed podem ser examinados com a versão comentada 2 .
Detalhes
[1] Testado e usado regularmente em um cluster Linux 4.8.16-200.fc24.x86_64 e testado em outros cinco tipos de Linux / Unix. Também é executado no Cygwin64 instalado no Windows 10. É necessário testar no iOS.
[2] Para ver a anatomia do comando mais claramente, este é o equivalente exato do comando pip3 acima com comentários:
# 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] Atualizar um componente Python ou PIP que também é usado na atualização de um componente Python ou PIP pode ser uma causa potencial de um impasse ou corrupção de banco de dados de pacotes.
pip freeze
(comobundle install
ounpm shrinkwrap
). É melhor salvar uma cópia disso antes de mexer.