2015-10-17 10 views
5

Sul mio sistema Windows 7 provo ad installare tanti pacchetti usando conda. Questi sono facili da aggiornare conAggiorna tutti i pacchetti pip che non provengono da conda

conda update all 

Purtroppo alcuni pacchetti non compaiono nella conda, ma sono disponibili attraverso pip e quindi per coloro che installano usando pip. L'aggiornamento di tutti i pacchetti pip su Windows sembra più difficile ma

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i 

è un modo che ho trovato.

Tuttavia, questo tentativo di aggiornare tutti i pacchetti, anche quelli installati da conda credo.

C'è un modo per aggiornare solo i pacchetti installati da pip?

risposta

1

Questo è complicato in quanto i pacchetti Pip sono diversi dai pacchetti conda. Anaconda aggiunge pip come scelta di installazione e li inserisce nell'ambiente ma non li gestisce. Pip è ancora senza un comando facile aggiornare tutti, ma alcuni suggerimenti sono come ci ha provato e questo è un altro:

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

Grazie per questo, ma la tua risposta non funzionerà su Windows e inoltre non impedisce a pip di aggiornare i pacchetti che conda sta gestendo? – eleanora

3

Qui è il mio tentativo di uno script di shell che analizzare l'output di conda env export e aggiornare ogni pacchetto PIP:

#!/bin/sh 

############################################################################### 
# Script to scan an Anaconda environment and upgrade any PIP packages. 
# 
# Usage: 
# $ ./upgrade_pip_packages.sh 
# or explicitly give it an environment file to parse: 
# $ ./upgrade_pip_packages.sh <environment.yml file> 
# 
# Author: Marijn van Vliet <[email protected]> 
# 
# Version: 1.0 (29-09-2017) 
# - Initial version of the script. 

# Check for optional command line argument 
if [ "$#" = 0 ] 
then 
    ENV_OUTPUT=`conda env export` 
elif [ "$#" = 1 ] 
then 
    ENV_OUTPUT=`cat $1` 
else 
    echo "Usage: $0 [environment file]" >&2 
    exit 1 
fi 

PIP=0 # Whether we are parsing PIP packages 
IFS=$'\n' # Split on newlines 
PIP_PACKAGES="" # PIP packages found thus far 

# Loop over the output of "conda env export" 
for line in $ENV_OUTPUT 
do 
    # Don't do anything until we get to the packages installed by PIP 
    if [ "$line" = "- pip:" ] 
    then 
     PIP=1 # From this point, start doing things. 
    elif [[ "$line" = prefix:* ]] 
    then 
     PIP=0 # End of PIP package list. Stop doing things. 
    elif [ $PIP = 1 ] 
    then 
     # Packages are listed as " - name==version==python_version" 
     # This is a regular expression that matches only the name and 
     # strips quotes in git URLs: 
     REGEXP='^ - "\?\([^="]*\)"\?.*$' 

     # Find PIP package name (or git URL) 
     PIP_PACKAGES="$PIP_PACKAGES `echo "$line" | sed -n "s/$REGEXP/\1/p"`" 
    fi 
done 

# From now on, split on spaces 
IFS=' ' 

echo "The following packages are marked for upgrade using PIP:" 
echo 
for package in $PIP_PACKAGES 
do 
    echo " - $package" 
done 
echo 

read -r -p "Shall we proceed with the upgrade? [y/N] " response 
case "$response" in 
    [yY][eE][sS]|[yY]) 
     # Upgrade each package 
     for package in $PIP_PACKAGES 
     do 
      pip install --upgrade $package 
     done 
     ;; 
    *) 
     echo "Aborting" 
     ;; 
esac