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 installounpm shrinkwrap). É melhor salvar uma cópia disso antes de mexer.