2015-10-17 8 views
5

Auf meinem Windows 7-System versuche ich, so viele Pakete mit Conda zu installieren. Diese sind leicht zu bearbeitenUpdate alle Pip-Pakete, die nicht aus Conda kommen

conda update all 

Leider einige Pakete erscheinen nicht in Conda sondern sind über pip und so für die, die ich installieren sie pip verwenden. Die Aktualisierung aller Pip-Pakete unter Windows scheint schwieriger, aber

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

ist eine Möglichkeit, die ich gefunden habe.

Allerdings versucht dies, alle Pakete zu aktualisieren, auch die von Conda installiert glaube ich.

Gibt es eine Möglichkeit, nur die von pip installierten Pakete zu aktualisieren?

Antwort

1

Dies ist schwierig, da Pip-Pakete anders als Conda-Pakete sind. Anaconda fügt pip als Installationsoption hinzu und fügt sie in die Umgebung ein, verwaltet sie jedoch nicht. Pip ist immer noch ohne einen einfachen Befehl, um alle zu aktualisieren, aber einige Vorschläge, wie Sie versucht, und das ist eine andere:

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

Vielen Dank dafür, aber Ihre Antwort wird nicht auf Windows funktionieren und verhindert auch nicht Pip von Upgrade-Pakete, die Conda verwaltet tut es? – eleanora

3

Hier ist mein Versuch, ein Shell-Skript, das die Ausgabe von conda env export und aktualisieren alle PIP-Pakete analysieren:

#!/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 
Verwandte Themen