Обновите все пакеты pip, которые не поступают от conda

В моей системе Windows 7 я пытаюсь установить как можно больше пакетов с помощью conda. Их легко обновить с помощью

conda update all

К сожалению, некоторые пакеты не отображаются в conda, но доступны через pip, поэтому я устанавливаю их с помощью pip. Обновление всех пакетов pip в Windows кажется более сложным, но

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

это один из способов, который я нашел.

Однако это пытается обновить все пакеты, даже те, которые, как мне кажется, установлены conda.

Есть ли способ обновить только те пакеты, которые установлены pip?


person eleanora    schedule 17.10.2015    source источник


Ответы (3)


Это еще один простой сценарий, использующий вывод conda list, который содержит список пакетов pip.

conda list | grep "<pip>" | cut -d " " -f 1 | xargs pip install --upgrade
person Ohgyun Ahn    schedule 18.10.2018

Вот моя попытка создать сценарий оболочки, который будет анализировать вывод conda env export и обновлять любые пакеты 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
person Marijn van Vliet    schedule 29.09.2017

Это сложно, поскольку пакеты Pip отличаются от пакетов conda. Anaconda добавляет pip в качестве варианта установки и помещает их в среду, но не управляет ими. У Pip все еще нет простой команды для обновления, но некоторые предложения такие же, как вы пробовали, и это еще один:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs pip install -U
person John Morrison    schedule 19.10.2015
comment
Спасибо за это, но ваш ответ не будет работать в Windows, а также не мешает pip обновлять пакеты, которыми управляет conda? - person eleanora; 10.11.2015