[Python] Обновление апгрейда в Amazon Linux


Answers

Некоторое время боролся с этим. Вот что я нашел:

  • ec2_user находит исполняемый файл pip , но имеет ошибку импорта модуля из-за того, что other не имеют прав на чтение / выполнение в папках pip в папке /usr/local/lib/python2.7/site-packages . Это на самом деле все в порядке, так как в большинстве случаев pip установкой пакетов не выполняются, если не выполняются как root .
  • sudo не может найти pip .
  • Ввод root с помощью sudo su - позволяет работать без проблем.

Причина, по которой sudo pip перестает работать после обновления, заключается в том, что исполняемый файл (или символическая ссылка) удаляется из /usr/bin . Однако остается файл с именем pip-27 , который содержит следующее:

#!/usr/bin/python2.7
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==6.1.1','console_scripts','pip2.7'
__requires__ = 'pip==6.1.1'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('pip==6.1.1', 'console_scripts', 'pip2.7')()
    )

Итак, именно здесь происходит наша ошибка, так как обновление явно не очищает этот файл. Не совсем понятно, где происходит pip имени от pip до pip-2.7 .

Как упоминалось в другом ответе, pip теперь существует в /usr/local/bin после обновления, который больше не находится в безопасном пути sudo . Вы можете добавить этот путь к переменной secure_path , выполнив sudo visudo . Другая альтернатива, если вы предпочитаете не добавлять этот путь к вашему secure_path - это сделать символическую ссылку на новый исполняемый файл pip в /usr/bin .

Question

Я хотел развернуть мое приложение Python на Amazon Linux AMI 2015.09.1, которое имеет Python2.7 (по умолчанию) и pip (6.1.1). Затем я обновил пип с помощью команды:

sudo pip install -U pip

Тем не менее, он был сломан и показал сообщение, когда я пытался установить пакеты:

pkg_resources.DistributionNotFound: pip==6.1.1

Я узнал, что pip удаляет предыдущие файлы, расположенные в /usr/bin/ , и устанавливает новый в /usr/local/bin . Таким образом, я попытался указать местоположение с помощью команды:

sudo pip install -U --install-option="--prefix='/usr/bin'" pip

Тем не менее, он все еще установил новый в /usr/local/bin . В дополнение к этому, pip не может работать хорошо с sudo хотя он успешно установлен. Сообщение об ошибке:

sudo: pip2.7: command not found

Есть ли способ правильно управлять пипсом?




Я думаю, что лучшей стратегией в этом случае является управление pip как частью виртуальной среды с использованием virtualenv а не возиться с версией на системном уровне.

Если вы в порядке с этим, вот основная идея:

  1. Установите версию virtualenv упакованную с версией pip вы хотите обновить до virtualenv==15.1.0 на системном уровне (например, virtualenv==15.1.0 поставляется с pip==9.0.1 ):

    $ sudo pip install -U virtualenv==15.1.0
    You are using pip version 6.1.1, however version 9.0.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    Collecting virtualenv==15.1.0
      Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
        100% |████████████████████████████████| 1.8MB 135kB/s
    Installing collected packages: virtualenv
      Found existing installation: virtualenv 12.0.7
        Uninstalling virtualenv-12.0.7:
          Successfully uninstalled virtualenv-12.0.7
    Successfully installed virtualenv-15.1.0
    

    Я использовал примечания о выпуске virtualenv чтобы узнать, какая версия pip соответствует той версии virtualenv .

  2. Создайте виртуальную среду:

    $ virtualenv myenv
    New python executable in /home/ec2-user/myenv/bin/python2.7
    Also creating executable in /home/ec2-user/myenv/bin/python
    Installing setuptools, pip, wheel...done.
    
  3. Активируйте виртуальную среду и подтвердите версию и расположение обновленного pip :

    $ source myenv/bin/activate
    (myenv) $ pip -V
    pip 9.0.1 from /home/ec2-user/myenv/local/lib/python2.7/dist-packages (python 2.7)
    (myenv) $ which pip
    ~/myenv/bin/pip
    

Это должно позволить вам устанавливать пакеты в этот virtualenv используя pip версию pip , без необходимости в sudo .




После битвы с этим в течение нескольких часов и чтения комментариев

which pip дал / usr / bin / pip, но фактический пип был расположен в / usr / local / bin / pip из-за обновления апгрейда и очистки не было завершено

Таким образом, удаление пипса в / usr / bin /

sudo rm / usr / bin / pip

а также добавление нового пункта в ваш путь экспорта

vim ~ / .bash_profile

PATH = $ PATH: $ HOME / бен: / USR / местные / бен

терминал выхода и логин назад

which pip должен дать / usr / local / bin / pip

pip install --upgrade pip





Links